有点令人费解的例子,但我不确定为什么TypeScript不会在这里抛出错误。
export class Square {
width: number;
}
export class MyShapeBox<T> {
shape: T;
}
var mySquareBox = new MyShapeBox<Square>();
var rectangle = { width: 3, height: 10 };
// Should this not fail?
mySquareBox.shape = rectangle;
通过我们的讨论,最好的猜测是TypeScript在分配值时会转换为基类型。但这意味着该课程的表现更像是一个界面。
我知道它对生成的基础JavaScript没有任何影响。
我真的好奇为什么这是行为,因为我预计它会抛出错误,就像你尝试分配一个未知属性一样。
答案 0 :(得分:5)
这在typescript中是允许的,因为矩形的形状与正方形的形状相匹配(它们都包含width
。如果你在矩形中注释掉width属性,如下所示:
var rectangle = { /*width: 3, */ height: 10 };
现在它不再编译了,因为矩形的形状不再与Square相匹配,因此赋值mySquareBox.shape = rectangle
失败了。
从TypeScript网站:
TypeScript的核心原则之一是类型检查侧重于值所具有的“形状”。这有时被称为“鸭子打字”或“结构子类型”。 Handbook
上面的引用是它编译没有错误的原因。
修改强>
我只讨论过从矩形对象中删除宽度,但如果向dummy
类添加Square
属性,则同样适用,因为在执行此操作后,形状再次不匹配。