TypeScript中如何正确定义支持泛型参数的内部类?
TypeScript泛型内部类实现方案
错误原因
原有写法在同名命名空间导出B类型时,没有声明泛型参数透传,导出的是固定非泛型类型,因此传入类型参数时会触发Type 'B' is not generic.(2315)报错。
正确实现代码
利用TS类与同名命名空间的声明合并特性,在命名空间中声明带泛型参数的类型别名,将泛型透传给内部类构造函数即可:
class A { // 定义静态泛型内部类表达式 static B = class B<T> { value: T; constructor(value: T) { this.value = value; } } } // 同名命名空间合并类型声明 namespace A { // 导出泛型类型,透传参数到内部类构造函数,通过InstanceType拿到对应实例类型 export type B<T> = InstanceType<typeof A.B<T>>; }
使用验证
以下代码可正常通过类型检查,无TS2315报错:
class DemoClass<T> { // 可正常传入泛型参数声明属性 protected buckets: Array<A.B<T>> = []; } // 实例化时可自动推导泛型类型 const strInstance = new A.B("hello"); // 类型为A.B<string> const numInstance = new A.B(123); // 类型为A.B<number>
注意事项
- 静态挂载的内部类无法访问外层类的实例级泛型参数,如果需要内外层共享泛型,可将内部类挂载为实例属性,通过
this["B"]获取类型即可,无需额外命名空间声明。 - 不要遗漏泛型参数的透传声明,否则导出的类型会丢失泛型签名。
内容的提问来源于stack exchange,提问作者Mike Lischke
相关产品推荐
相关产品推荐

