结构打字不是鸭子打字

时间:2018-05-01 14:18:15

标签: javascript typescript type-systems duck-typing structural-typing

如TypeScript handbook中所述:

  

TypeScript的核心原则之一是类型检查关注于值所具有的形状。这有时被称为“鸭子打字”或“结构子类型”。在TypeScript中,接口充当命名这些类型的角色,......

我的理解是,上述核心原则与 Duck typing Structural typing无关,因为TypeScript是静态类型语言。

wiki中所述:它要求将类型检查推迟到运行时,并通过动态类型或反射来实现...对象的适用性由存在决定某些方法和属性(具有适当的含义),而不是对象的实际类型。

我如何理解TypeScript的上述核心原理?

2 个答案:

答案 0 :(得分:4)

来自Duck testDuck Typing以及维基百科

  

如果看起来像鸭子,像鸭子一样游泳,像鸭子一样呱呱叫,那么它可能是一只鸭子。

这实际上是TypeScript接口的工作方式。对象只需要看起来像接口而不是显式实现它。

表格链接到的页面:

interface LabelledValue {
    label: string;
}

function printLabel(labelledObj: LabelledValue) {
    console.log(labelledObj.label);
}

let myObj = {size: 10, label: "Size 10 Object"};
printLabel(myObj);

即使myObj没有显式实现LabelledValue接口,它也具有相同的结构,因此隐式实现了接口。这是Duck Typing

更新如果将LabelledValue接口定义为类,则上述代码不会编译"。这是结构类型。

注意 TypeScript没有运行时检查,因为它是"编译"到JavaScript

答案 1 :(得分:1)

Column(
   mainAxisAlignment: MainAxisAlignment.spaceAround,
   children: <Widget>[
     Text(times[index]),
     newMessagehasCome ? Icon(Icons.laptop) ? 
   ], 
)

duck typing