TypeScript:构造签名和类型的交集类型不起作用,但对于调用签名和类型确实如此

时间:2017-07-12 12:35:50

标签: typescript typescript2.0

我想创建一个交集类型,它由构造函数签名和其他类型组成。

type CustomMixer<T1, T2> = (new (...args: any[]) => T1) & T2
  

Generelly我需要这个来注释函数的返回类型,它将一些静态方法设置为一个类( Function ),如Object.assign(MyCtorFn, staticMethods)

TypeScript允许创建此类型,并将其返回,但我无法使用new关键字初始化该类型。

const MyType: CustomMixer<Foo, Bar> = someFactoryFunction()
const x = new MyType()
  

不能使用&#39; new&#39;使用表达式,其类型缺少调用或构造签名。

但是,如果CustomMixer交集包含呼叫签名和其他类型,那么一切都按预期工作。

type CustomMixer<T1, T2> = ((...args: any[]) => T1) & T2
const MyType: CustomMixer<Foo, Bar> = someFactoryFunction()
MyType.| // Autocompletion for T2 works
const x = MyType()
x.|// Autocompletion for T1 works

以下是TS Playground

的链接

是否可以让第一个例子有效? 谢谢。

1 个答案:

答案 0 :(得分:1)

你可以这样做:

type CustomMixer<T1, T2> = T1 & T2;

function CustomMixerFactory<T1, T2>(): CustomMixer<T1, T2> {
    // Mimic typed return
    return null as CustomMixer<T1, T2>;
}

const MyType = CustomMixerFactory<typeof Foo, Baz>();

MyType.isBaz(); // fine
let myType = new MyType(); // fine
myType.isFoo(); // fine