5

如 TypeScript手册中所述:

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


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

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

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

4

2 回答 2

6

来自Duck testDuck Typing以及 Wikipedia

如果它长得像鸭子,游得像鸭子,叫起来像鸭子,那么它很可能就是鸭子。

这基本上就是 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接口,它也具有相同的结构,因此隐式实现了接口。这是鸭子打字

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

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

于 2018-05-01T14:42:28.620 回答
1
interface Duck {
    typing(): void;
}

const porky = {} as Duck;

try {
    porky.typing();
} catch (error) {
    console.log(error); // TypeError: porky.typing is not a function
}

const isDucky = (it: { typing?: () => void }): it is Duck =>
    typeof it.typing === 'function';

const daffy = {
    typing: () => console.log('tappity tap tap')
};

if (isDucky(daffy)) {
    daffy.typing(); // tappity tap tap
}

鸭子打字

于 2020-05-01T10:59:28.567 回答