第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

擴(kuò)展接口的接口問(wèn)題

擴(kuò)展接口的接口問(wèn)題

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

2 回答

?
翻閱古今

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超5個(gè)贊

你有沒(méi)有考慮過(guò)使用多態(tài)的這個(gè)而不是泛型的?您的 和 將成為:ComparableObserver


interface Comparable {

    equals: (item: this) => boolean;

}


interface Observer extends Comparable {

    notify: () => void

}

這意味著擴(kuò)展類型的對(duì)象需要具有一個(gè)取類型值的方法。請(qǐng)注意,這意味著在可替代性和繼承性方面不像正常類型。一般來(lái)說(shuō),如果你有,那么你應(yīng)該能夠使用任何你需要的: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

無(wú)論如何,這個(gè)定義將允許您按原樣實(shí)現(xiàn):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

所以你可能會(huì)決定你實(shí)際上不想以這種方式約束。equals()


查看完整回答
反對(duì) 回復(fù) 2022-08-27
?
收到一只叮咚

TA貢獻(xiàn)1821條經(jīng)驗(yàn) 獲得超5個(gè)贊

在 TestA 類和 TestB 類中更改和 to。equals(item: TestA)equals(item:TestB)equals(item : Observer)


由于可比類型被給出為可觀察。


在等體中,您可以將可觀察對(duì)象轉(zhuǎn)換為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 = () => {}

}


查看完整回答
反對(duì) 回復(fù) 2022-08-27
  • 2 回答
  • 0 關(guān)注
  • 91 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)