Typescript
对象类型
TypeScript 有三种表示"对象"的类型:Record<string, any>、object 和 Object。三者看起来相似,但适用场景不同。
| 类型 | 接受原始值 | 可访问属性 | 推荐程度 |
|---|---|---|---|
Record<string, any> | 否 | 是 | 推荐,用于动态键对象 |
object | 否 | 否(需先断言) | 适用于限制非原始类型 |
Object | 是 | 否(过于宽泛) | 不推荐 |
Record<string, any>
表示键为字符串、值为任意类型的对象。适合处理结构不固定的动态数据。
const data: Record<string, any> = {
name: 'Alice',
age: 30,
isActive: true,
metadata: { role: 'admin' },
}
data.newProperty = 'New Value' // 允许动态添加键object
TypeScript 的内置原始类型,表示所有非原始类型(排除 number、string、boolean、symbol、null、undefined)。使用 object 类型时,无法直接访问属性,需要先进行类型断言。
const obj: object = { key: 'value' }
// @errors: 2339
console.log(obj.key) // 错误:类型 object 上不存在属性 key
const specificObj = obj as { key: string }
console.log(specificObj.key) // 输出: "value"Object
广义对象类型,接受原始值和对象,因为 JavaScript 中所有值都继承自 Object.prototype。
const anyObj: Object = { name: 'Alice' } // 对象
const anyNumber: Object = 42 // 数字(合法,但不推荐)
const anyString: Object = 'Hello' // 字符串(合法,但不推荐)Object 过于宽泛,无法区分对象与原始值,容易引发运行时错误。实际开发中优先使用 Record<K, V> 或具体的接口类型。