TypeScript 中的 object literal 是什么?与普通 object 有何区别?
Object Literal 的定义及与普通 Object 的差异
你已经理解的基础类型字面量逻辑可以直接套用到对象上,两者核心逻辑完全一致:字面量就是「明确固定结构/值的窄类型」,和宽泛的通用类型对应。
实际定义
object literal 中文译名为对象字面量,分两个层面理解:
- 值层面:指直接用
{ key: value }语法声明的对象值,和new Object()、构造函数生成的对象同属对象值的不同创建方式,比如const obj = { a: 1 }中等号右侧的部分就是对象字面量。 - 类型层面:指 TypeScript 为字面量形式的对象推导/声明的固定结构类型,这个类型会严格限定对象的属性数量、属性名、属性值类型,比如上面的
obj推导出来的类型是{ a: number },而非宽泛的object类型。
和普通 object 类型的核心差异
普通object是通用的宽泛类型,仅限定值的类型为对象,不限制任何属性结构,适用所有对象类型的值;而对象字面量类型是固定结构的窄类型,仅匹配结构完全符合的对象值,两者的区别可以参考"bob"和string的区别。
以下是示例对比:
// 通用object类型 let commonObj: object commonObj = { x: 1 } // 合法 commonObj = [1, 2] // 合法,数组本质也是对象 commonObj = new Date() // 合法 commonObj = { y: 'test' } // 合法,不限制结构 // 对象字面量类型 let literalObj: { x: number } literalObj = { x: 1 } // 合法 literalObj = [1, 2] // 报错,结构不匹配 literalObj = { x: 1, y: 'test' } // 直接赋值字面量时触发新鲜度检查,报错多余属性 const temp = { x: 1, y: 'test' } literalObj = temp // 非字面量直接赋值时不触发新鲜度检查,结构匹配即可通过
内容的提问来源于stack exchange,提问作者dwjohnston
相关产品推荐
相关产品推荐

