对于以下代码,
interface SquareConfig{
color?: string;
width?: number;
}
interface Square{
color: string;
area: number;
}
function createSquare(config: SquareConfig): Square {
let newSquare:Square = {color: "white", area: 100};
if (config.color) {
newSquare.color = config.color;
}
if (config.width) {
newSquare.area = config.width * config.width;
}
return newSquare;
}
下面的参数(myObj
)推断为类型any
被允许在编译时由类型检查器作为参数传递。 JS代码在运行时使用duck typing。
let myObj = {colour: 'red', width: 100};
let mySquare = createSquare(myObj);
在第二种情况下,不允许在编译时通过类型检查器传递下面的参数(除SquareConfig
类型除外)。如手册中所述:对象文字在将其分配给其他变量或将它们作为参数传递时,会得到特殊处理并进行多余的属性检查。
let mySquare = createSquare({colour: 'red', width: 100});
在第二种情况下,超额财产检查的目的是什么?
答案 0 :(得分:5)
在第二种情况下,超额财产检查的目的是什么?
它可以正确检测错误(如本例中所示,color
的拼写错误),而不会产生太多误报。
由于该对象在其他任何地方都没有别名,因此TypeScript可以相当确信多余属性不会在代码的其他部分用于其他目的。同样不能说myObj
- 我们可能只是在.width
检查它,而是在其他地方使用.colour
。