interface I {
test: (a: I) => boolean;
}
class Test implements I {
//constructor (public additional: number) {}
test (a: Test) { return false; }
}
代碼有效,但如果我們從建構式行中洗掉注釋,則它不起作用。它給出的錯誤是
“I”型別缺少“Test”型別中的以下屬性:附加
現在這是愚蠢還是我愚蠢?如果Test工具I比它應該通過如I在test?
如何組織這種多重繼承型別的支持?
uj5u.com熱心網友回復:
我可以想到兩種方法來解決這個問題。兩者都有一些缺點。
第一種方法是this在界面中使用多型。這意味著引數的型別將是任何實作者:
interface I {
test: (a: this) => boolean;
}
class Test implements I {
constructor (public additional: number) {}
test (a: Test) { return false; }
}
let o:I = new Test(1); // error
游樂場鏈接
這種方法的問題是你失去了介面的可分配性。根據您的用例,這可能沒問題。
另一種選擇是在您的界面中使用方法簽名而不是函式簽名。方法簽名是雙變數檢查的(如果您想了解有關方差的更多資訊,我在這里有一個視頻)。這意味著您的代碼型別安全性較低,但您可以毫無問題地實作該類,并且不會失去I介面的可分配性:
interface I {
test(a: I): boolean;
}
class Test implements I {
constructor (public additional: number) {}
test (a: Test) { return this.additional === a.additional; }
}
class Test2 implements I {
constructor (public additional2: number) {}
test (a: Test2) { return this.additional2 === a.additional2; }
}
let o:I = new Test(1);
o.test(new Test2(1)) // this will access additional when Test2 only has additional2
游樂場鏈接
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/387150.html
標籤:打字稿
上一篇:如何以角度自動更新API回應
