You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 12:36:03