我在TypeScript中使用交集类型时发现了一个问题...
我有三种类型别名:
Prototype<T>
- 表示具有prototype
属性的对象/类。DefaultCtor<T>
- 使用默认构造函数表示对象/类。ParameterizedCtor<T>
表示带参数化构造函数的对象/类。我尝试过这些交集排列:
Prototype<T> & DefaultCtor<T>
- 效果很好。Prototype<T> & ParameterizedCtor<T>
- 引发编译错误。示例
type Prototype<T> = {
prototype: T;
}
type DefaultCtor<T> = {
new(): T;
}
type ParameterizedCtor<T> = {
new(...args: any[]): T
}
function makeDefault<T>(ctor: Prototype<T> & DefaultCtor<T>): T {
return new ctor();
}
function makeWithArgs<T>(ctor: Prototype<T> & ParameterizedCtor<T>, ...args: any[]): T {
return new ctor(...args);
// ERROR: Cannot use 'new' with an expression whose type lacks a call or construct signature.
}
中试用
错误
Prototype<T> & ParameterizedCtor<T>
交叉点出现错误:
不能对类型缺少调用的表达式使用'new' 构建签名。
为什么TypeScript编译器将Prototype<T> & DefaultCtor<T>
交集类型识别为具有构造函数,而不是Prototype<T> & ParameterizedCtor<T>
交集类型?
答案 0 :(得分:4)
这似乎是一个已知的错误,在Microsoft/TypeScript#17388提交,于2017年7月报告。它预定为TypeScript v2.9修复,但该问题的历史看起来像修复版本已经推了几次。去那儿,如果你觉得这么倾向,我想?希望有所帮助。祝你好运。
答案 1 :(得分:0)
解决方法强>
在某些边缘情况下,使用强制转换将提供临时解决方案,而TypeScript团队会提出修复。
示例强>
function make<T>(ctor: Prototype<T> & ParameterizedCtor<T>, ...args: any[]): T {
console.log(ctor.prototype);
return new (ctor as ParameterizedCtor<T>)(...args);
}