打字稿:类型 ConstructorParameters 不接受泛型

Bee*_*ice 5 types typescript

使用 typescript 3.7,我有一个接口,其属性旨在接受构造函数:

interface IConstruct<T> {
  type: new (...args:ConstructorParameters<T>) => T;
}
Run Code Online (Sandbox Code Playgroud)

我的想法是,IConstruct<User>会有一个属性{type: User}
但是编译器告诉我T不能在那里使用。这是为什么?

TS2344:类型 T 不满足约束“new (...args: any) => any”

for*_*d04 5

类型ConstructorParameters如下所示:

type ConstructorParameters<T extends new (...args: any) => any> =
  T extends new (...args: infer P) => any ? P : never;
Run Code Online (Sandbox Code Playgroud)

因此类型参数T本身必须扩展由约束定义的某种构造函数extends new (...args: any) => any。像这样写上面的例子,你应该很高兴:

class User {
    constructor(public name: string) { }
}

// add constructor function type constraint for T
interface IConstruct<T extends new (...args: any) => any> {
    // we can use built-in InstanceType to infer instance type from class type
    type: new (...args: ConstructorParameters<T>) => InstanceType<T>;
}

type UserConstruct = IConstruct<typeof User>

const constr: UserConstruct = {
    type: User
}

constr.type // new (name: string) => User

const userInstance = new constr.type("John") // userInstance: User

console.log(userInstance.name) // John
Run Code Online (Sandbox Code Playgroud)

操场

  • @BeetleJuice不完全是,有一个区别:“User”是实例的类型,“typeof User”是实际的类类型。[此处](https://www.typescriptlang.org/docs/handbook/classes.html#constructor-functions) 是文档中的一个很好的示例。 (2认同)