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

如何为存储派生类的变量正确添加TypeScript类型

TypeScript中存储派生类构造函数的正确类型标注

你遇到的问题核心是:要存储的是类的构造函数而非实例,原来的handler: Base类型标注错误,因为Derived是类本身(构造函数),不是Base的实例对象。

正确的类型标注方式

有两种等价的方式可以定义handler的类型:

方式1:使用构造函数签名

直接定义一个能生成Base实例的无参构造函数类型:

interface OneNode {
  handler: new () => Base;
}

方式2:使用typeof Base

抽象类的typeof类型就是其构造函数类型,同样能匹配所有派生类的构造函数:

interface OneNode {
  handler: typeof Base;
}

修正后的完整代码

abstract class Base {
  constructor() {
    console.log("Base");
  }

  abstract fun(): void; // 补充返回类型,提升代码规范性
}

class Derived extends Base {
  constructor() {
    super();
    console.log("Derived");
  }

  fun() {
    console.log("Have fun");
  }
}

interface OneNode {
  handler: new () => Base; // 二选一即可
}

const availableNodes: OneNode[] = [
  { handler: Derived } // 不再报错
];

// 正常实例化并调用方法
const y = new availableNodes[0].handler();
y.fun();

原理说明

  • new () => Base表示一个无参数的构造函数,调用后返回Base类型的实例,所有继承Base的派生类构造函数都满足这个约束。
  • typeof Base对应抽象类Base的构造函数类型,派生类的构造函数天然继承了Base的构造签名,因此也能匹配这个类型。

内容的提问来源于stack exchange,提问作者SiliconValley

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 03:49:56