使用 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”
类型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)
| 归档时间: |
|
| 查看次数: |
2068 次 |
| 最近记录: |