2 回答

TA貢獻1780條經驗 獲得超5個贊
你有沒有考慮過使用多態的這個而不是泛型的?您的 和 將成為:ComparableObserver
interface Comparable {
equals: (item: this) => boolean;
}
interface Observer extends Comparable {
notify: () => void
}
這意味著擴展類型的對象需要具有一個取類型值的方法。請注意,這意味著在可替代性和繼承性方面不像正常類型。一般來說,如果你有,那么你應該能夠使用任何你需要的:XComparableequals()XComparableinterface B extends A {...}BA
interface A {
someMethod(x: A): void;
}
interface B extends A {
someOtherMethod(x: B): void;
}
declare const b: B;
const a: A = b; // okay
但這不適用于:Comparable
declare const o: Observer;
const c: Comparable = o; // error! equals is incompatible
無論如何,這個定義將允許您按原樣實現:Comparable
class TestA implements Observer {
private name = '';
equals = (item: TestA) => {
return this.name === item.name
}
notify = () => { }
}
class TestB implements Observer {
private name = '';
equals = (item: TestB) => {
return this.name === item.name
}
notify = () => { }
}
但同樣,如果您嘗試將 或 視為 :TestATestBObserver
function takeObservers(o1: Observer, o2: Observer) {
o1.equals(o2);
}
takeObservers(new TestA()); // error
所以你可能會決定你實際上不想以這種方式約束。equals()

TA貢獻1821條經驗 獲得超5個贊
在 TestA 類和 TestB 類中更改和 to。equals(item: TestA)equals(item:TestB)equals(item : Observer)
由于可比類型被給出為可觀察。
在等體中,您可以將可觀察對象轉換為TestA,并比較其名稱屬性,如下所示。
在 TestA 類中。
class TestA implements Observer {
private name = '';
equals = (item: Observer) => {
if(item instanceof TestA){
return this.name === (item as TestA).name
}
return false
}
notify = () => {}
}
添加回答
舉報