对象类型
除了原始类型(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());
}