TypeScript泛型类内部定义派生类型的正确实现方案
解决方案:在泛型类中复用派生类型
为什么原写法报错
TypeScript的类体仅支持声明属性、方法、构造函数等成员,不允许在类内部(包括静态成员区)定义type或interface,所以static type FT = ...的语法不符合规范,会直接抛出错误。
可行方案
方案1:外部泛型类型别名
把复用的派生类型抽成独立的泛型类型别名,在类中传入泛型参数T即可:
// 定义复用的泛型类型 type FT<T> = (t: T) => void; class MyClass<T> { t: T; doSomeThing(f: FT<T>) {} doAnotherThing(g: FT<T>) {} }
方案2:类关联的命名空间类型
如果希望类型和类逻辑上绑定,避免全局命名污染,可以用命名空间和类合并的方式:
class MyClass<T> { t: T; // 使用命名空间中的FT类型,传入当前类的泛型T doSomeThing(f: MyClass.FT<T>) {} doAnotherThing(g: MyClass.FT<T>) {} } // 定义和类同名的命名空间,存放关联类型 namespace MyClass { export type FT<T> = (t: T) => void; }
方案3:利用类的实例属性类型(进阶)
如果派生类型直接依赖类的实例属性,可以通过属性索引类型快速引用,适合简单场景的简化写法:
class MyClass<T> { t: T; doSomeThing(f: (t: MyClass<T>['t']) => void) {} doAnotherThing(g: (t: MyClass<T>['t']) => void) {} }
内容的提问来源于stack exchange,提问作者Ali Khosro
相关产品推荐
相关产品推荐

