有点复杂的例子,但我不确定为什么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;
Run Code Online (Sandbox Code Playgroud)
根据我们的讨论,最好的猜测是TypeScript在分配值时会转换为基类型.但这意味着该类实际上更像是一个界面.
我知道它对生成的底层JavaScript没有任何影响.
我真的很好奇为什么这是行为,因为我希望它会抛出一个错误,就像你尝试分配一个未知属性一样.
这在打字稿中是允许的,因为矩形的形状与正方形的形状相匹配(它们都包含width.如果你注释掉矩形中的width属性,如下所示:
var rectangle = { /*width: 3, */ height: 10 };
Run Code Online (Sandbox Code Playgroud)
现在它不再编译了,因为矩形的形状不再与Square相匹配,因此分配mySquareBox.shape = rectangle失败.
从TypeScript站点:
TypeScript的核心原则之一是类型检查侧重于值所具有的"形状".这有时被称为"鸭子打字"或"结构子类型".手册
上面的引用是它编译没有错误的原因.
编辑
我只谈到从矩形对象中删除宽度,但是如果dummy向Square类中添加属性,则同样适用,因为在执行此操作后,形状再次不匹配.
| 归档时间: |
|
| 查看次数: |
110 次 |
| 最近记录: |