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

Kev*_*son 1 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;
Run Code Online (Sandbox Code Playgroud)

在线版

根据我们的讨论,最好的猜测是TypeScript在分配值时会转换为基类型.但这意味着该类实际上更像是一个界面.

我知道它对生成的底层JavaScript没有任何影响.

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

Dic*_*ink 5

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

var rectangle = { /*width: 3, */ height: 10 };
Run Code Online (Sandbox Code Playgroud)

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

从TypeScript站点:

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

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

编辑

我只谈到从矩形对象中删除宽度,但是如果dummySquare类中添加属性,则同样适用,因为在执行此操作后,形状再次不匹配.