FumadocsZDecode
Typescript

对象类型

TypeScript 有三种表示"对象"的类型:Record<string, any>objectObject。三者看起来相似,但适用场景不同。

类型接受原始值可访问属性推荐程度
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 的内置原始类型,表示所有非原始类型(排除 numberstringbooleansymbolnullundefined)。使用 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> 或具体的接口类型。

On this page