TS的鸭式辨型法

所谓的鸭式辨型法就是像鸭子一样走路并且嘎嘎叫的就叫鸭子,即具有鸭子特征的认为它就是鸭子,也就是通过制定规则来判定对象是否实现这个接口。

1
2
3
4
5
6
7
8
9
interface LabeledValue {
label: string;
}
function printLabel(labeledObj: LabeledValue) {
console.log(labeledObj.label);
}
let myObj = { size: 10, label: "Size 10 Object" };
printLabel(myObj); // OK
printLabel({ size: 10, label: "Size 10 Object" }); // Error

上面代码,在参数里写对象就相当于是直接给 labeledObj 赋值,这个对象有严格的类型定义,所以不能多参或少参。而当你在外面将该对象用另一个变量 myObj 接收,myObj 不会经过额外属性检查,但会根据类型推论为 let myObj: { size: number; label: string } = { size: 10, label: "Size 10 Object" };,然后将这个 myObj 再赋值给 labeledObj,此时根据类型的兼容性,两种类型对象,参照鸭式辨型法,因为都具有 label 属性,所以被认定为两个相同,故而可以用此法来绕开多余的类型检查。


TS的鸭式辨型法
https://www.wobushi.top/2021/TS的鸭式辨型法/
作者
Pride Su
发布于
2021年12月28日
许可协议