TypeScript:泛型类实现的包装器



为什么以下内容在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,即Specific1Specific2

在我正在进行的项目中,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游乐场链接,展示了这两种方法。

最新更新