在将匿名对象分配给类型属性时,TypeScript是否会推断出类型?

时间:2014-12-12 11:18:47

标签: typescript

有点令人费解的例子,但我不确定为什么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;

Online version

通过我们的讨论,最好的猜测是TypeScript在分配值时会转换为基类型。但这意味着该课程的表现更像是一个界面。

我知道它对生成的基础JavaScript没有任何影响。

我真的好奇为什么这是行为,因为我预计它会抛出错误,就像你尝试分配一个未知属性一样。

1 个答案:

答案 0 :(得分:5)

这在typescript中是允许的,因为矩形的形状与正方形的形状相匹配(它们都包含width。如果你在矩形中注释掉width属性,如下所示:

var rectangle = { /*width: 3, */ height: 10 };

现在它不再编译了,因为矩形的形状不再与Square相匹配,因此赋值mySquareBox.shape = rectangle失败了。

从TypeScript网站:

  

TypeScript的核心原则之一是类型检查侧重于值所具有的“形状”。这有时被称为“鸭子打字”或“结构子类型”。 Handbook

上面的引用是它编译没有错误的原因。

修改

我只讨论过从矩形对象中删除宽度,但如果向dummy类添加Square属性,则同样适用,因为在执行此操作后,形状再次不匹配。