TypeScript日常类型(5): Object Types

128 阅读1分钟

对象类型

除了原始类型(primitive types),最常见的类型就是 对象类型(object types) 。这里指的是任何具有属性的 JavaScript 值,而几乎所有的值都符合这一条件!

要定义一个对象类型,只需列出它的属性及其类型。例如,下面是一个接收“点”对象的函数:

// The parameter's type annotation is an object type
function printCoord(pt: { x: number; y: number }) {
  console.log("The coordinate's x value is " + pt.x);
  console.log("The coordinate's y value is " + pt.y);
}

printCoord({ x: 3, y: 7 });

在这个例子中,我们为参数 pt 指定了一个具有 两个属性(x 和 y)的对象类型,它们的类型都是 number。 这两个属性之间可以用 , 或 ; 分隔,最后一个分隔符可选。

此外,每个属性的类型部分也是 可选的,如果不指定类型,TypeScript 会将其默认为 any。

可选属性

对象类型可以指定部分或全部属性为 可选的,只需在属性名后添加 ?:

function printName(obj: { first: string; last?: string }) {
  // ...
}

// 这两种调用方式都可以
printName({ first: "洛" });
printName({ first: "洛", last: "尘" })

在 JavaScript 中,访问一个不存在的属性不会报错,而是返回 undefined。因此,当访问可选属性时,需要 先检查是否为 undefined,否则可能会导致运行时错误。例如:

// @errors: 18048  - 'obj.last' is possibly 'undefined'.
function printName(obj: { first: string; last?: string }) {
  // ❌ 错误:如果 obj.last 没有提供,调用 toUpperCase() 会崩溃!
  console.log(obj.last.toUpperCase());
  
  if (obj.last !== undefined) {
    // ✅ 正确:先检查 obj.last 是否为 undefined
    console.log(obj.last.toUpperCase());
  }

  // ✅ 更安全的方式:使用可选链(Optional Chaining)
  console.log(obj.last?.toUpperCase());
}