TypeScript入门到精通——TypeScript类型系统基础——对象类型

对象类型

  在 JavaScript 中存在这样一种说法,那就是 "一切皆为对象"。有这种说法是因为 JavaScript 中绝大多数值都可以使用对象来表示。例如:函数、数组和对象字面量本质上都是对象。对于原始数据类型、如 String 类型,JavaScript 也提供了相应的构造函数来创建能够表示原始值的对象。例如,下例中使用内置的 String 构造函数构建了一个表示字符串的对象,示例如下:

const hi = new String('hi')                                                                                                                                                                       

  我们介绍三种基本的对象类型:

1、Object 类型(首字母为大写字母 O)

2、object 类型(首字母为小写字母 o)

3、对象类型字面量

1、Object

  这里的 Object 指的是 Object 类型,而不是 JavaScript 内置的 "Object()" 构造函数。这里一定要区分两者,Object 类型表示一种类型,而 "Object()" 构造函数表示一个值。因为 "Object()" 构造函数是一个值,所以它也有自己的类型。

let obj1 = new Object();  
let obj2 = {key: "value"};  
  
console.log(typeof obj1); // "object"  
console.log(typeof obj2); // "object" 

  这里我们可以看到,无论是通过 "Object()" 构造函数还是通过字面量创建的对象,它们的类型都是 "object"。"Object" 指的是一种类型(所有的对象都是这种类型的实例),而 "Object()" 是一个构造函数,用于创建新的对象实例。虽然它们都叫 "Object",但它们的含义完全不同。

  在TypeScript中,Object类型代表了所有对象。你可以使用Object类型来声明一个对象变量,这个变量可以接受任何类型的对象。

let myObject: Object;  
myObject = { a: 1, b: '2', c: true };  // 正确,因为所有类型都是 Object 的子类型

2、object

  在 TypeScript 2.2 版本中,增加了一个新的 object 类型表示非原始类型。object 类型使用 object 关键字作为标识,object 类型名中的字母全部为小写。

const point: object = {x:0, y:0}
           let myObject: object;  // 等同于 let myObject: {}  
myObject = { a: 1, b: '2', c: true };  // 正确,因为所有对象都是 object 的实例

3、字面类型字面量

  你可以使用对象字面量来定义一个对象类型。

let myObject: { a: number, b: string, c: boolean };  // 定义了一个具有三个属性的对象类型  
myObject = { a: 1, b: '2', c: true };  // 正确,因为符合定义的类型  

注意:如果你只定义了一部分属性,那么其他未定义的属性将被允许存在,但你不能访问未定义的属性。这被称为可选属性。例如:

let myObject: { a: number, b?: string };  // 'b' 是可选的,如果存在则必须为 string 类型,如果不存在则不能访问  
myObject = { a: 1 };  // 正确,因为 'b' 是可选的  
myObject = { a: 1, b: '2' };  // 正确,因为 'b' 是可选的,且其类型为 string  
console.log(myObject.b);  // 错误,因为 'b' 不存在
posted @ 2023-10-24 10:29  左扬  阅读(118)  评论(0编辑  收藏  举报
levels of contents