为什么这个TypeScript常量不满足这个接口?

时间:2018-04-06 17:49:51

标签: typescript

我正在尝试实现一个符合具有调用签名和构造函数签名的接口的函数。我已经在这里的类型声明中看到了这种情况:https://github.com/Microsoft/TypeScript/blob/master/lib/lib.d.ts#L142

我希望能够自己实现这样的东西。以下是我的尝试。

class C {
    public x: number;
    constructor(x: number) {
        return { x };
    }
}

interface I {
    new(x: number): C;
    (x: number): C;
}

const x: I = C;

我认为它应该有效,因为我们可以致电new x(3)我们会回复C,同样,我们可以致电x(3)并取回C,但是有一个错误:

Type 'typeof C' is not assignable to type 'I'. Type 'typeof C' provides no match for the signature '(x: number): C'

为方便起见,我将代码复制到可访问here的游乐场代码段中。

1 个答案:

答案 0 :(得分:4)

预计I可以作为常规函数调用,而ES6类只能使用new调用。

即使C可以像C(1) 一样调用E5目标,因为它已被转换为常规函数(尽管显式{ x }返回不使用{ {1}}是反模式的,ES6类不能。

由于历史原因,存在允许带有和不带this且具有相同结果的调用的ObjectConstructor(指定Object内置)等接口。除此之外,这种方法不适用于ES6课程,如果一个函数无法从new调用中受益,那么它通常不被认为是一种好的做法。

为了匹配new类型,I应该声明它,因为类和脚中的类和空函数是法律C,返回值的函数不是:

new