亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

擴展接口的接口問題

擴展接口的接口問題

慕田峪7331174 2022-08-27 14:08:20
我希望實現 Observer 接口的類也實現可比較接口,我該怎么做?interface Comparable<T> {    equals: (item: T) => boolean;}interface Observer extends Comparable<Observer> {    notify: () => void}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 = () => {}}錯誤:TS2416:類型“TestA”中的屬性“等于”不能分配給基類型“Observer”中的同一屬性。類型'(item: TestA) =>布爾值'不能分配給類型'(item:Observer) =>布爾值'。參數“item”和“item”的類型不兼容。屬性“name”在類型“Observer”中缺失,但在類型“TestA”中是必需的。但是,TestA實現了觀察者接口,為什么它們不兼容?當然,我可以這樣寫:class TestA implements Observer {    private name = '';    equals = (item: Observer) => {        return this.name === item.name    }    notify = () => {}}但是后來我得到了這樣的錯誤,此外,這并不完全正確,因為我只想比較這個類的對象:屬性“name”在類型“Observer”上不存在。如何正確地做到這一點?“typescript”: “^3.9.2”
查看完整描述

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()


查看完整回答
反對 回復 2022-08-27
?
收到一只叮咚

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 = () => {}

}


查看完整回答
反對 回復 2022-08-27
  • 2 回答
  • 0 關注
  • 95 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號