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' 不存在