Duck Typing 是一种在动态类型语言中常用的类型安全检查方式,它的名字来源于“如果它走路像鸭子,叫声像鸭子,那么它可能就是鸭子”的说法。在 TypeScript 这样的静态类型语言中,Duck Typing 体现为结构子类型化(Structural Subtyping)或者称为结构类型系统。
在 TypeScript 中,如果两个对象具有相同的结构,TypeScript 将它们视为相同的类型。这意味着对象的类型兼容性是由其成员决定的,这与传统的名义(基于名称的)类型系统不同,后者要求通过显式声明来确定类型的兼容性。
例子:
考虑下面的 TypeScript 代码:
typescriptinterface Duck { walk: () => void; quack: () => void; } function makeTheAnimalQuack(duck: Duck) { duck.quack(); } const myDuck = { walk: () => console.log("The duck is walking."), quack: () => console.log("The duck quacks."), swim: () => console.log("The duck swims.") }; // 即使 `myDuck` 没有显式声明为 `Duck` 类型,但它拥有 `walk` 和 `quack` 方法, // 因此它符合 `Duck` 接口的结构,可以被传入 `makeTheAnimalQuack` 函数 makeTheAnimalQuack(myDuck);
在这个例子中,myDuck
对象并没有显式声明它实现了 Duck
接口,但它具有 walk
和 quack
方法,这与 Duck
接口定义的结构匹配。因此,TypeScript 编译器认为 myDuck
是符合 Duck
类型的,允许它被作为参数传给 makeTheAnimalQuack
函数。
这种类型检查方式提高了 TypeScript 的灵活性和表达力,允许开发者在不牺牲类型安全的前提下,编写出更加通用和可重用的代码。
2024年11月29日 09:29 回复