首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >结构类型不是鸭子类型。

结构类型不是鸭子类型。
EN

Stack Overflow用户
提问于 2018-05-01 14:18:15
回答 2查看 1.9K关注 0票数 5

正如TypeScript 手册中提到的

类型记录的核心原则之一是,类型检查侧重于价值观的形状。这有时被称为“鸭子类型”或“结构子类型”.In TypeScript,接口填充命名这些类型的角色,.

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

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

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

EN

回答 2

Stack Overflow用户

发布于 2018-05-01 14:42:28

来自鸭试验鸭型以及维基百科

如果它看起来像鸭子,游泳像鸭子,叫声像鸭子,那么它很可能是鸭子。

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

形成链接到的页面:

代码语言:javascript
复制
interface LabelledValue {
    label: string;
}

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

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

尽管myObj没有显式地实现LabelledValue接口,但它确实具有相同的结构,因此隐式地实现了接口。这是鸭子打字

如果UPDATELabelledValue接口定义为类,那么上面的代码就不会“编译”。这是结构打字。

Note TypeScript没有运行时检查,因为它是“编译”到JavaScript的。

票数 6
EN

Stack Overflow用户

发布于 2020-05-01 10:59:28

代码语言:javascript
复制
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
}

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50118155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档