【TypeScript】Object、object和{}类型


Object、object和{}(对象类型)

Object

Object类型是所有 Object 类的实例的类型。它由以下两个接口来定义:

  • Object 接口定义了 Object.prototype 原型对象上的属性;
  • ObjectConstructor 接口定义了 Object 类的属性。

如何理解上述两点呢?

Object是一个对象,但是是包含了js原始的所有公用的功能,这个需要去了解js的原型链(这里不过多进行讲述),从TypeScript源码进行分析:

interface Object {
   /** The initial value of Object.prototype.constructor is the standard built-in Object constructor. */
   constructor: Function;
   /** Returns a string representation of an object. */
   toString(): string;
   /** Returns a date converted to a string using the current locale. */
   toLocaleString(): string;
   /** Returns the primitive value of the specified object. */
   valueOf(): Object;
   /**
    * Determines whether an object has a property with the specified name.
    * @param v A property name.
    */
   hasOwnProperty(v: PropertyKey): boolean;
   /**
    * Determines whether an object exists in another object's prototype chain.
    * @param v Another object whose prototype chain is to be checked.
    */
   isPrototypeOf(v: Object): boolean;
   /**
    * Determines whether a specified property is enumerable.
    * @param v A property name.
    */
   propertyIsEnumerable(v: PropertyKey): boolean;
}
interface ObjectConstructor {
 /** Invocation via `new` */
 new(value?: any): Object;
 /** Invocation via function calls */
 (value?: any): any;
 readonly prototype: Object;
 getPrototypeOf(o: any): any;
 // ···
}
declare var Object: ObjectConstructor;

从中可以看出,Object的构造函数指向了Function,在学习js原型链时我们知道Object和Function是相互指向对方的

Object类型可以通过new进行创建;

注意:Object类型包含了所有的原始/基础类型,所以可以给Object类型赋值为基础类型;如果值对象属性名与 Object 接口中的属性冲突,则 TypeScript 编译器会提示相应的错误:如下例,对象中重写了toString方法,但是返回类型和Object中返回类型string冲突,所以报错;

let obj: Object; // 或者 let obj = new Object();
obj = "hell oworld";
obj = 1;
obj = true;
obj = undefined; //Error:Type 'undefined' is not assignable to type 'Object'.
obj = {
  	// Type 'number' is not assignable to type 'string'
    toString() {
        return 123;
    }
}

数组型Object => Object[]:因为Object包含原始类型,所以下面代码编译不会报错

let obj: Object[];
obj = [
    123,
    true,
    "hello world",
    [1, 'a', false]
];

object

object 类型是:TypeScript 2.2 引⼊的新类型,它⽤于表示⾮原始类型。object是键值对集合,特殊在值也必须是object

注意:object类型默认可以使用在 Object 类型上定义的所有属性和方法,这些属性和方法可通过 JavaScript 的原型链隐式地使用,但是如果在object中重写了原型链中的属性或者方法,那么会直接覆盖,不受原型链上的影响!

let obj: object; 
obj = 1; // Error:Type 'number' is not assignable to type 'object'.
obj = true; // Error: Type 'boolean' is not assignable to type 'object'.
obj = 'a'; // Error: Type 'string' is not assignable to type 'object'.
obj = undefined; //Error:Type 'undefined' is not assignable to type 'object'.
obj = {
    a : "hell oworld",
    b : 1,
    c : true,
}

obj = {
    toString() {
        return 123;
    }
}
console.log(obj.toString()) // 123

{}/空类型

空类型:{}。它描述了一个没有成员的对象,在typeScript中可以有以下方式生成空类型:

  • 1、没有声明变量类型,但是初始值为{}

    let obj = {}; 
    
  • 直接声明变量类型为{}

    let obj: {}; 
    

当你试图访问这样一个对象的任意属性时,TypeScript 会产生一个编译时错误;但是,你仍然可以使⽤在 Object 类型上定义的所有属性和⽅法,这些属性和⽅法可通过 JavaScript 的原 型链隐式地使⽤:

let obj: {}; 
obj = undefined; //Error:Type 'undefined' is not assignable to type '{}'.
obj = 'a';
obj = {
    a : "hell oworld",
    b : 1,
    c : true,
    toString() {
        return 123;
    }
}
console.log(obj) 
/*
{
  "a": "hell oworld",
  "b": 1,
  "c": true
} 
*/
console.log(obj.toString()) // 123;

总结(比较)

对于Object、object和{},三者都可以使⽤在 Object 类型上定义的所有属性和⽅法,这些属性和⽅法可通过 JavaScript 的原 型链隐式地使⽤;并且都不能被赋值为undefined、null类型;

Object vs object:

  • 1、两者原型上属性方法重写表现不一致;
  • 2、object类型值表示⾮原始类型,Object类型值可以为原始类型;
  • 3、Object可以通过new来定义类型;

Object vs {}:

  • 1、两者类型值可以为原始类型;
  • 2、两者原型上属性方法重写表现不一致;
  • 3、Object可以通过new来定义类型;

object vs {}:

  • 1、两者原型上属性方法重写表现一致;
  • 2、object类型值表示⾮原始类型,{} 类型值可以为原始类型;
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值