[英]Typescript Generic Base On Subclass Type
假設有兩個類:
class A<I> {
inner: I;
setInner: () => Partial<I>;
}
class B extends A<B['inner']> {
inner = {
data1: 123,
data2: '123',
};
setInner = () => {
return { data1: 456 };
};
}
我希望類 A 規定其所有子類的“setInner”函數只能返回其自身內部對象的部分並具有相同的類型。 上面的代碼是可以接受的,但我仍然想在擴展時刪除 A 的泛型( "A<B['inner']>" ),因為如果我需要多個內部屬性和多個類 B,它將是喜歡:
class B1 extends A<B1['inner1'], B1['inner2'], B1['inner3'], ...> {...}
class B2 extends A<B2['inner1'], B2['inner2'], B2['inner3'], ...> {...}
class B3 extends A<B3['inner1'], B3['inner2'], B3['inner3'], ...> {...}
class B4 extends A<B4['inner1'], B4['inner2'], B4['inner3'], ...> {...}
所以每次我想復制一個B類或者添加一個內部屬性時,我必須修改整個A<B1['inner1'], B1['inner2', B1['inner3'], ...>,其中很煩人。
有什么方法可以在類 A 中定義類似“this”的東西,但指的是子類 B 的對象實例? 或者有什么方法可以使 B 類更簡單,即使是非常復雜的 A 類,因為可能有數百個 B 但只有一個 A。
我發現它能夠將子類作為超類的泛型:
class A<Sub extends { inner1?: any; inner2?: any }> {
setInner1: () => Partial<Sub['inner1'];
setInner2: () => Partial<Sub['inner2'];
}
class B extends A<B> {
inner1 = { key: 123 };
inner2 = { key: 'abc' };
setInner1 = () => ({ key: 456 }); // This works
setInner2 = () => ({ key: 123 }); // This gives an error
}
這樣,在給類添加內部屬性時,不需要更改子類文件,代碼也很短。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.