ove*_*nge 5 javascript type-systems duck-typing structural-typing typescript
正如 TypeScript手册中提到的:
TypeScript 的核心原则之一是类型检查侧重于值的形状。这有时被称为“鸭子类型”或“结构子类型”。在 TypeScript 中,接口扮演着命名这些类型的角色,...
我的理解是,上述核心原则与Duck 类型无关,而是与结构类型有关,因为 TypeScript 是静态类型语言。
正如维基中提到的:它要求类型检查推迟到运行时,并通过动态类型或反射来实现......对象的适用性取决于某些方法和属性(具有适当含义)的存在,而不是对象的实际类型。
如何理解上述TypeScript的核心原理?
来自Duck test和Duck 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