为什么以下内容在TypeScript中不可能?
abstract class Generic<T> {
// ...
}
class Specific1 extends Generic<string> {
// ...
}
class Specific2 extends Generic<number> {
// ...
}
// this is where stuff goes wrong, compiler wants me to provide generic type arguments
// |
// ˅
abstract class Wrapper<T extends Generic> {
// ...
}
class Wrapper1 extends Wrapper<Specific1> {
// ...
}
class Wrapper2 extends Wrapper<Specific2> {
// ...
}
使用Wrapper
泛型类行,我试图表示我只想让类进入Wrapper
作为"的泛型类型;具体实施的";Generic
,即Specific1
和Specific2
。
在我正在进行的项目中,Generic
的泛型类型比这里显示的要多,还有更多的实现,即更多的SpecificX
类。我可以通过将之前传递给SpecificX
的所有泛型类型传递到WrapperX
来避免这个问题,如下所示:
class Specific1 extends Generic<type1, type2, type3> {
...
}
...
class Wrapper1 extends Wrapper<type1, type2, type3> {
...
}
但我只是觉得很脏,我想知道是否有更好的方法来解决这个问题。我已经定义了SpecificX
类及其泛型类型,并希望避免在其他位置再次这样做。
简单的DRY,但我不知道如何在TypeScript中做到这一点:(
如果Wrapper
应该能够包装任何Generic
,而您并不真正关心实际的Specific
类型,那么显式地将类型参数标记为unknown
就可以了。通过以下操作,您可以为任何扩展Generic
的内容创建包装器。
abstract class Wrapper<T extends Generic<unknown>>
如果Wrapper
应该只包装其中一个Specific
类型,那么您可以使用并集类型来解决此问题。制作一个包含所有选项的新类型可能是个好主意。这肯定更详细,但可以防止任何任意的东西(例如Generic<ButNotASpecificType>
(被包装。
class Specific1 extends Generic<string> {
// ...
}
class Specific2 extends Generic<number> {
// ...
}
type Specific = Specific1 | Specific2
abstract class Wrapper<T extends Specific>
这里有一个TypeScript游乐场链接,展示了这两种方法。