TypeScript:如何定义表示实现抽象类的类类型的参数
解决方案
TypeScript 完全支持该能力,你的写法存在两个核心误区:
implements关键字仅校验类的实例侧成员是否符合约束,不会校验static修饰的静态侧成员,你定义在抽象类上的bar属于类本身的静态属性,天然不在implements的校验范围内- 你要的
Type<foo>实质是匹配抽象类静态侧结构的类型,不能直接用抽象类本身作为类型参数
最简实现方案
你可以直接使用typeof 抽象类作为参数类型即可满足需求:
abstract class Foo { public static bar: string; } class Baz { public static bar: string = 'qux'; } function quxx(t: typeof Foo) { console.log(t.bar); } quxx(Baz); // 正常输出 "qux" // 若传入的类没有符合要求的静态bar属性,TypeScript会直接抛出类型错误
如果你需要同时约束类的实例成员和静态成员
如果你的抽象类同时包含实例成员,希望类的实例也符合抽象类的约束,可以额外加一层静态约束的校验工具:
abstract class Foo { // 静态侧约束 public static bar: string; // 实例侧约束 public abstract instanceProp: number; } // 静态侧约束接口 interface FooConstructor { new (...args: any[]): Foo; bar: string; } // 校验类同时符合静态+实例约束的工具函数 function defineFooClass<T extends FooConstructor>(cls: T): T { return cls; } const Baz = defineFooClass(class Baz extends Foo { public static bar = 'qux'; public instanceProp = 123; }); function quxx(t: FooConstructor) { console.log(t.bar); } quxx(Baz); // 输出 "qux"
内容的提问来源于stack exchange,提问作者CoryG
相关产品推荐
相关产品推荐

