TypeScript 中的空对象字面量类型({})object 类型以及Object类型之间的异同
在 TypeScipt 中为对象添加一个类型有下面几种方式:
-
对象字面量,也可以说是按照对象结构直接进行描述的一种方式,其适用场景为:明确知道对象拥有的属性及对应的类型,(PS:接口其实和属性类型映射的方式其实可以看成是一种字面量类型)如:
let obj: { a: string } = {a: 'demo'} -
空对象字面量 (
{}),可以指代除了undefined和null之外的任何类型,但不推荐使用这种方式 -
显式注解为
object类型,可以指代 JS 的对象类型的值 ({},[],function(){},new ClassObj()),当需要一个对象且不管其属性的时候可以使用这种方式 -
显式注解
Object类型,同空对象字面量类型一样可以指代除了undefined和null之外的任何类型,同样不推荐使用这种方式
从上面我们可以看出,TS 中为对象声明类型大体上有四种方式,其中空对象字面量类型和Object类型看上去能代表的类型是一样的,那么它们是否可以互换呢?
答案是大多数情况下可以,不过还是不建议用这两种方式注解类型,但在针对覆盖 Object.prototype 原型链内置方法上还是有些差异的。这里中 toString() 举例说明
// 直接调用对象内置的 toString() 方法
const normalObj = {}
console.log(normalObj.toString()) // "[object Object]"const emptyLiteralObj: {} = {toString() { // 定义一个同名方法覆盖 Object.prototype 上内置的 toString() 方法return 1}
}
console.log(emptyLiteralObj.toString()) // 3const ObjectTypeObj: Object = {toString() {// 问题来了,返回一个非 string类型的值,在编译阶段报错了return 1 // Type '() => number' is not assignable to type '() => string'.// Type 'number' is not assignable to type 'string'.}
}
通过分析,知道空对象字面量类型与 Object 类型的差异了:
如果对象内有Object.prototype 的同名方法,用空对象字面注解的,其同名方法可以返回任意类型的值,但用 Object 进行注解的,其同名方法的返回值需与内置同名方法的返回值的类型保持一致,这就是它们之间细微的差异。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
