对象类型(object)
在 TypeScript 中,object 类型和对象字面量类型是两种不同的概念。object 类型表示任何非原始类型的值(即不是 string, number, boolean, symbol, bigint, undefined, 或 null 的值)。而对象字面量类型则是指具体定义了属性及其类型的对象。
Object 类型
object 类型是一个非常宽泛的类型,它代表所有非原始类型的实例。这意味着它可以是普通对象、数组、函数、正则表达式等。使用时应当谨慎,因为它缺乏具体的结构信息,不能提供严格的类型检查:
let notVeryUseful: object = {}; // 这可以是任何非原始类型的值由于 object 类型过于宽松,通常推荐使用更具体的类型来代替,例如接口、类型别名或内置的数组和函数类型。
对象字面量类型
对象字面量类型允许你精确地定义对象的形状,包括其属性的名称、类型以及是否为可选。这有助于确保代码的安全性和可读性。
定义对象字面量类型
你可以直接在赋值语句中定义对象的类型:
let point: { x: number; y: number } = { x: 10, y: 20 };或者,更常见的是通过接口或类型别名来定义对象类型:
interface Point {
x: number;
y: number;
}
let point: Point = { x: 10, y: 20 };可选属性
如果一个属性可能是存在的也可能是不存在的,可以使用问号 ? 标记该属性为可选:
interface SquareConfig {
color?: string;
width?: number;
}只读属性
使用 readonly 关键字可以使某些属性成为只读属性,这意味着它们只能在对象创建时被赋值:
interface Point {
readonly x: number;
readonly y: number;
}
let p1: Point = { x: 10, y: 20 };
// p1.x = 5; // 错误! 不能对只读属性 'x' 赋值额外属性检查
默认情况下,TypeScript 会检查对象是否有额外的属性。如果你希望允许额外的属性,可以使用索引签名或类型断言:
interface SquareConfig {
color?: string;
width?: number;
[propName: string]: any; // 允许额外的任意属性
}
// 或者使用类型断言
let squareOptions = { colour: "red", width: 100 } as SquareConfig;函数类型作为对象属性
对象的属性也可以是函数类型:
interface SearchFunc {
(source: string, subString: string): boolean;
}
let mySearch: SearchFunc;
mySearch = function (source: string, subString: string) {
return source.search(subString) !== -1;
};索引签名
对于那些可以通过索引访问的数据结构(如数组或映射),你可以定义索引签名:
interface StringArray {
[index: number]: string;
}
let myArray: StringArray;
myArray = ["Bob", "Fred"];
let myStr: string = myArray[0];扩展对象类型
你可以通过接口继承来扩展现有的对象类型:
interface Shape {
color: string;
}
interface Square extends Shape {
sideLength: number;
}
let square: Square = { color: "blue", sideLength: 10 };混合类型
有时你可能想要一个对象既有数据属性又有函数调用的能力。这称为混合类型:
interface Counter {
(start: number): string;
interval: number;
reset(): void;
}
function getCounter(): Counter {
let counter = <Counter>function (start: number) {};
counter.interval = 123;
counter.reset = function () {};
return counter;
}
let c = getCounter();
c(10);
c.reset();
c.interval = 5.0;总结
object 类型和对象字面量类型在 TypeScript 中有明确的区别。object 类型用于描述任何非原始类型的值,而对象字面量类型则提供了更加详细的结构信息,使我们能够编写出更加类型安全的代码。通过接口、类型别名和其他高级特性,TypeScript 提供了强大的工具来定义复杂且灵活的对象类型。