我有一個從父類繼承的子類。子類無法獲取父類的型別
class Foo {
foo: string = ''
merge(opts: Partial<this>): this { return this }
}
class Bar extends Foo {
bar() {
return this.merge({ // typing error because foo is not declared as a property of Bar
foo: '3'
})
}
}
uj5u.com熱心網友回復:
您至少有 2 個選項:
- 第一個是覆寫繼承類中的方法
class Foo {
foo: string = ''
merge(opts: Partial<Foo>): Partial<Foo> { return this }
}
class Bar extends Foo {
asd: string = 'qweqwe';
merge(opts: Partial<Bar>): Partial<Bar> { return super.merge(opts); }
bar() {
return this.merge({
foo: '3',
asd: "ceva"
})
}
}
let a = new Foo()
console.log(a.merge({}))
let b = new Bar()
console.log(b.bar())
- 其次是創建一個
merge需要在呼叫站點傳遞型別的通用方法。類似的東西。
class Foo {
foo: string = ''
merge<U extends Foo>(opts: Partial<U>): Partial<U> { return this as unknown as Partial<U> }
}
class Bar extends Foo {
asd: string = 'qweqwe';
bar() {
return this.merge<Bar>({
foo: '3',
asd: "ceva"
})
}
}
let a = new Bar()
console.log(a.bar())
uj5u.com熱心網友回復:
在這種情況下,您不應將this其用作型別。將其替換為實用程式ThisType。
class Foo {
foo: string = ''
merge(opts: Partial<ThisType<Foo>>): ThisType<Foo> { return this }
}
操場
uj5u.com熱心網友回復:
一種選擇是將子類作為通用引數傳遞給基類:
class Foo<T extends Foo<T>> {
foo: string = ''
merge(opts: Partial<T>): Partial<Foo<T>> { return this }
}
class Bar extends Foo<Bar> {
x: string = ''
bar() {
return this.merge({
foo: '3',
x: 'a'
})
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/481028.html
標籤:打字稿
下一篇:打字稿中物件陣列的聯合?
