簡體   English   中英

基於子類類型的 Typescript 泛型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM