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

TypeScript中如何实现泛型类的类型安全类构造函数?

解决TypeScript泛型构造函数类型安全问题

你的代码报错是因为ConstructorParameters<typeof T>中的typeof T用法错误——T是类型层面的标识,而typeof操作符只能作用于运行时的值,不能直接用于类型,所以会提示“T仅指类型,但此处用作值”。

以下是两种可行的修复方案,都能实现类型安全的类实例构造:

方案1:泛型约束为构造函数类型

直接将泛型参数约束为构造函数类型,通过ConstructorParameters和InstanceType工具类型分别提取参数类型和实例类型:

function createEntity<C extends new (...args: any[]) => any>(
  ctor: C,
  ...args: ConstructorParameters<C>
): InstanceType<C> {
  return new ctor(...args);
}

方案2:用infer推导构造函数参数

通过infer关键字从构造函数类型中推断出参数类型,保留实例类型T的泛型定义:

function createEntity<T>(
  ctor: new (...args: infer P) => T,
  ...args: P
): T {
  return new ctor(...args);
}

验证示例

定义一个测试类,调用上述函数时会自动校验参数类型:

class User {
  constructor(public name: string, public age: number) {}
}

// 正确调用,参数类型匹配
const validUser = createEntity(User, "Alice", 30);

// 错误调用,TypeScript会直接提示类型不匹配(而非仅提示参数过多)
const invalidUser = createEntity(User, 30, "Alice");

这两种方案都能解决原问题:既消除编译报错,又能在调用时严格检查参数的类型和数量,实现真正的类型安全。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 12:10:16