class A {
public string getId() {}
public void setId(string id) {}
}
class B {
public string getId() {}
public void setId(string id) {}
}
A obj1 = new A();
B obj2 = new B();
// 虽然 A 跟 B 的属性类型都一样,但这里 obj1 跟 obj2 在编译器看来不是同一种类型
public static void foo(A a);
foo(obj1); // 编译通过
foo(obj2); // 编译不通过,参数类型不匹配;除非二者有继承关系
而 TS 中则没有此问题:
interface A {
id: string;
}
interface B {
id: string;
}
interface C {
id: number;
}
let obj1: A = { id: '' };
let obj2: B = { id: '' };
let obj3: C = { id: 0 };
function foo(a: A): void {}
foo(obj1); // ok
foo(obj2); // ok
foo(obj3); // error!
发布评论
评论(1)
即鸭子类型。
只要一个对象的属性类型跟另一个对象的属性类型都相同,就认为这俩对象是同一种类型,不需要有什么继承之类的 OOP 关系。
我不知道题主有没有其他强类型 OOP 语言的功底,如果有的话就很容易理解了:
以 Java 为例:
而 TS 中则没有此问题: