【发布时间】:2021-08-31 11:33:31
【问题描述】:
我正在学习子类型,想知道为什么这里给出的示例 https://www.typescriptlang.org/docs/handbook/type-compatibility.html 可以编译,但是当我将子类型作为参数直接传递给函数时,它不会编译。
这是来自 typescriptlang.org 的原始代码
interface Named {
name: string;
}
let x: Named;
// y's inferred type is { name: string; location: string; }
let y = { name: "Alice", location: "Seattle" };
function greet(n: Named) {
console.log("Hello, " + n.name);
}
greet(y); // OK
编译得很好。但是这个版本,子类型没有分配给 y,失败了。
interface Named {
name: string;
}
let x: Named;
function greet(n: Named) {
console.log("Hello, " + n.name);
}
greet({ name: "Alice", location: "Seattle" }); // NOT OK
我得到错误:
类型参数 '{ name: string;位置:字符串; }' 不可分配给“命名”类型的参数。对象字面量只能指定已知属性,而“命名”类型中不存在“位置”。
为什么必须先将子类型 { name: "Alice", location: "Seattle" } 分配给变量?
【问题讨论】:
-
它被称为多余的属性检查,只有当你为给定类型的参数分配一个新的对象字面量时才会触发它。
-
Titian Cernicova-Dragomir 已经给了你答案,但你应该查看官方文档以获得更深入的解释:typescriptlang.org/docs/handbook/interfaces.html 另外,如果你不想使用变量,还有另一个选项: greet({ name: "Alice", location: "Seattle" } as Named);
标签: typescript subtyping