Skip to content

对象类型(object)

在 TypeScript 中,object 类型和对象字面量类型是两种不同的概念。object 类型表示任何非原始类型的值(即不是 string, number, boolean, symbol, bigint, undefined, 或 null 的值)。而对象字面量类型则是指具体定义了属性及其类型的对象。

Object 类型

object 类型是一个非常宽泛的类型,它代表所有非原始类型的实例。这意味着它可以是普通对象、数组、函数、正则表达式等。使用时应当谨慎,因为它缺乏具体的结构信息,不能提供严格的类型检查:

typescript
let notVeryUseful: object = {}; // 这可以是任何非原始类型的值

由于 object 类型过于宽松,通常推荐使用更具体的类型来代替,例如接口、类型别名或内置的数组和函数类型。

对象字面量类型

对象字面量类型允许你精确地定义对象的形状,包括其属性的名称、类型以及是否为可选。这有助于确保代码的安全性和可读性。

定义对象字面量类型

你可以直接在赋值语句中定义对象的类型:

typescript
let point: { x: number; y: number } = { x: 10, y: 20 };

或者,更常见的是通过接口或类型别名来定义对象类型:

typescript
interface Point {
  x: number;
  y: number;
}

let point: Point = { x: 10, y: 20 };

可选属性

如果一个属性可能是存在的也可能是不存在的,可以使用问号 ? 标记该属性为可选:

typescript
interface SquareConfig {
  color?: string;
  width?: number;
}

只读属性

使用 readonly 关键字可以使某些属性成为只读属性,这意味着它们只能在对象创建时被赋值:

typescript
interface Point {
  readonly x: number;
  readonly y: number;
}

let p1: Point = { x: 10, y: 20 };
// p1.x = 5; // 错误! 不能对只读属性 'x' 赋值

额外属性检查

默认情况下,TypeScript 会检查对象是否有额外的属性。如果你希望允许额外的属性,可以使用索引签名或类型断言:

typescript
interface SquareConfig {
  color?: string;
  width?: number;
  [propName: string]: any; // 允许额外的任意属性
}

// 或者使用类型断言
let squareOptions = { colour: "red", width: 100 } as SquareConfig;

函数类型作为对象属性

对象的属性也可以是函数类型:

typescript
interface SearchFunc {
  (source: string, subString: string): boolean;
}

let mySearch: SearchFunc;
mySearch = function (source: string, subString: string) {
  return source.search(subString) !== -1;
};

索引签名

对于那些可以通过索引访问的数据结构(如数组或映射),你可以定义索引签名:

typescript
interface StringArray {
  [index: number]: string;
}

let myArray: StringArray;
myArray = ["Bob", "Fred"];

let myStr: string = myArray[0];

扩展对象类型

你可以通过接口继承来扩展现有的对象类型:

typescript
interface Shape {
  color: string;
}

interface Square extends Shape {
  sideLength: number;
}

let square: Square = { color: "blue", sideLength: 10 };

混合类型

有时你可能想要一个对象既有数据属性又有函数调用的能力。这称为混合类型:

typescript
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 提供了强大的工具来定义复杂且灵活的对象类型。

Released under the MIT License.