考虑以下场景:
class Test<A extends myObjectType = myObjectType, B extends myOtherObjectType = myOtherObjectType> {};
const TestValue: Test<myObjectType, myChangedObjectType> = ...
是否有可能以某种方式仅覆盖某些分配有默认值的通用变量?
我想要实现的是有能力做这样的事情:
class SecondTest extends <_, myChangedObjectType> { ... }
我希望 Typescript 知道,通过省略第一个通用参数(通过为其提供默认值,例如 _),我指的是原始类的默认值。
正如 @T.J.Crowder 所说,没有办法改变或覆盖通用参数。
不过,有一个解决方法。您可以创建新类型,该类型继承先前类型的第一个参数并添加新的泛型类型
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;
操场 https://www.typescriptlang.org/play?#code/C4TwDgpgBAtiDyAjAVhAxsAKuaBeKA3gFBRTACGA5gFxQDkcSqG2kdRAvkaJLAsAAsIAJybosOKPmKkKNeo0EixLHOy5E0AG3IBnXVEwRdwADwBBKBAAewCADsAJgcYpxrPHxUTIAGigAQla2Ds5eSqJuqrz4ikKRzD4QAHyEUBwA3ETZPNAAwgLk9pQQpiRQeTr6wXZOBkYmpkUg-s3JvuUAchAA7h41oS788d4eqbjlABSVegY2tWENZgCW9gBmIoY4-qsbwlAA+snlpAD8UJP984NeUUknpFDnS6Ye-t19OMePj7T2EAA3EQASgef0BIJykgKRRKjikFUKxVKL1ciTe4RGdzG-jiymxkgAZGlKMIIBBgLQ6EItFoAPZ0dLJLJERzoHRkqAA8j7NBIuG0GHIxwsoA
您只能推断第一个泛型类型,并使用第一个泛型类型和新的第二个泛型类型构造新类型。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)