结构类型不是鸭子类型

ove*_*nge 5 javascript type-systems duck-typing structural-typing typescript

正如 TypeScript手册中提到的:

TypeScript 的核心原则之一是类型检查侧重于值的形状。这有时被称为“鸭子类型”或“结构子类型”。在 TypeScript 中,接口扮演着命名这些类型的角色,...


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

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

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

phu*_*uzi 6

来自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);
Run Code Online (Sandbox Code Playgroud)

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

更新如果LabelledValue接口被定义为一个类,那么上面的代码就不会“编译”。这是结构类型。

注意TypeScript 没有运行时检查,因为它被“编译”成 JavaScript