我想看看抽象類中的函式的回傳型別是否可以被子類重寫:
Parent.ts
abstract class Parent< T> {
抽象的 data: T | T[];
//這能否回傳為T或T[](而不是T | T[]),取決于的實作。
//child?
getData(){
return this.data。
}
Child.ts
class Child extends Parent < Person> {
data: Person[] = [] 。
index.ts
const child = new Child() 。
child.getData() //能不能不通過型別轉換自動回傳Person[]?
我知道我可以在index.ts中進行型別轉換,但我想知道是否有辦法讓TypeScript自動推斷出資料的型別。
uj5u.com熱心網友回復:
正如@jcalz在評論中指出的。答案是使用多型的this型別。謝謝你的幫助!
uj5u.com熱心網友回復:
當你想讓一個類動態地參考 "當前 "類實體的型別,這可能是一個更具體的子類,你可以使用多型的this型別(也就是說,你把this作為一個型別)。
事實上,如果你在getData()的實作里面檢查this的型別,你會看到編譯器推斷它是this型別:
// this: this。
但是編譯器經常會將this擴大到類的型別,特別是當你訪問一個屬性時;所以當this的型別被看作是this的型別時,this.data的型別被看作是Parent<T>['data'],也就是T | T[]。 相反,你想要的是this['data'],意思是 "在任何this上的data屬性的型別"。
如果你想防止將this['data']擴大到Parent<T>['data'],你可以明確地annotate一個此型別的新變數:
getData() {
const data: this['data'] = this.data。
return data。
或者你可以注解方法的回傳型別:
span class="hljs-title function_">getData()。this['data'/span>] {
return this.data。
}
或者你可以斷定回傳值為該型別:
getData() {
return this. data as this['data'] 。
}
一旦你這樣做了,那么子類中的getData()的呼叫者將擁有你所關心的更具體的型別資訊:
interface Person { name: string }
class Child extends Parent<Person> {
data: Person[] = [] 。
}
const child = new Child() 。
child.getData().map(person => person. name); // okay。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/332477.html
標籤:
