【发布时间】:2018-10-11 14:09:58
【问题描述】:
TypeScript 中提到过handbook:
TypeScript 的核心原则之一是类型检查侧重于值的形状。这有时被称为“鸭子类型”或“结构子类型”。在 TypeScript 中,接口扮演命名这些类型的角色,...
我的理解是,上面的核心原理与Duck typing无关,而是Structural typing,因为TypeScript是静态类型语言。
正如wiki 中提到的:它要求将类型检查推迟到运行时,并通过动态类型或反射来实现......对象的适用性取决于某些方法和属性的存在(具有适当的含义),而不是对象的实际类型。
上面的TypeScript核心原理怎么理解?
【问题讨论】:
-
This is sometimes called "duck typing"... 根据严格的定义,我没有看到 TypeScript 是正式的 Duck Typing 系统的说法,并且快速的谷歌搜索显示了这个声明是真实的。 TypeScript 并不真正适合维基百科的文章,因为它根本不是一种运行时语言,它只是一个类型检查器。然而,它确实符合一些标准,包括基本的鸭子原理以及它编译为 JavaScript(一种动态类型语言)的事实。 -
@Aaron 类型检查侧重于 value 的形状,与结构类型有关,但与 Duck 类型无关。因为我对其含义的理解是……类型兼容性和等价性由类型的实际结构或定义决定。在手册中,它也说了同样的话...... 值得指出的是,类型检查器不要求这些属性以任何顺序出现,只需要接口所需的属性存在并且具有所需的属性输入。
-
我认为您对duck-typing 使用的定义没有错,但在该术语的使用方式上并不完整,这就是TypeScript 有时被称为“duck typing”的原因。
-
@Aaron 由于在编译时与运行时进行类型检查,我看到下面的示例是这样的。1)
let myObj:labelledValue = {size: 10, label: "Size 10 Object"};必须在编译时进行类型检查,遵循结构类型。 2)function printLabel(labelledObj: LabelledValue) {..}中接收到的参数对象只能在运行时检查,这里没有类型(function printLabel(labelledObj) {}),所以很明显JS遵循的规则是一样的(duck typing),在第二种情况。 -
是的,如果你想说,TS 是“编译时鸭式”。
标签: javascript typescript type-systems duck-typing structural-typing