仅覆盖一些通用变量

2024-05-12

考虑以下场景:

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(使用前将#替换为@)

仅覆盖一些通用变量 的相关文章

随机推荐