考慮以下場景:
class Test<A extends myObjectType = myObjectType, B extends myOtherObjectType = myOtherObjectType> {};
const TestValue: Test<myObjectType, myChangedObjectType> = ...
是否有可能以某種方式只覆寫一些已分配給它們的默認值的通用變數?
我想要實作的是做這樣的事情的能力:
class SecondTest extends <_, myChangedObjectType> { ... }
我希望 Typescript 知道,通過省略第一個泛型引數(通過為其提供默認值,例如 _),我指的是原始類的默認值。
uj5u.com熱心網友回復:
正如@TJCrowder 所說,沒有辦法改變或覆寫泛型引數。
但是,有一個解決方法。您可以創建從先前型別繼承第一個引數的新型別并添加新的泛型型別
type myObjectType = {
tag: 'myObjectType'
}
type myOtherObjectType = {
tag: 'myOtherObjectType'
}
class Test<A extends myObjectType = myObjectType, B extends myOtherObjectType = myOtherObjectType> { };
type Change<
Class extends Test<any, any>,
NewType extends myOtherObjectType> =
(Class extends Test<infer Type, infer _>
? (Type extends myObjectType
? Test<Type, NewType>
: never)
: never)
type Changed = Change<Test<myObjectType, myOtherObjectType>, myOtherObjectType & { greet: 'hello' }>;
declare var changed: Changed;
操場
您只能推斷第一個泛型型別并使用第一個泛型型別和新的第二個泛型型別構造新型別。
uj5u.com熱心網友回復:
如果未指定先前的型別引數,則不能指定后面的型別引數。這是有關型別引數默認值的2.3 檔案的鏈接,但我認為它沒有改變(v.4.4.4 操場不允許我這樣做)。
因此,您可以省略示例中的第二個型別引數 ( Test<something>),或兩者 ( Test),但在指定第二個 ( Test</*nothing here*/, something>)時不能只省略第一個引數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/330856.html
標籤:打字稿
