除非与接口合并,否则在函数上使用new不起作用.为什么?

BFr*_*ree 7 typescript

这是假设noImplicityAny设置为true.

鉴于这种:

function Bar() {
    this.f = 100;
}
Run Code Online (Sandbox Code Playgroud)

这不起作用:

let x = new Bar();

你得到的错误是:

'new'表达式,其目标缺少构造签名,隐式具有"any"类型.

好吧,我想这有点道理.

但是,如果我在混音中添加一个界面,它可以正常工作:

interface Bar { 
     f: number;
}

function Bar() {
    this.f = 100;
}

let x = new Bar();
console.log(x.f);
Run Code Online (Sandbox Code Playgroud)

当鼠标悬停在Bar您身上时,请将其视为以下类型:

interface Bar function Bar(): void

所以我知道正在进行一些合并.我现在还不清楚为什么这个有用呢?这个新的合并类型究竟是什么,为什么函数的返回类型Bar()不再暗示any

Uza*_*jid 3

您正在经历的是TypeScript 中的声明合并。基本上,如果两个实体具有相同的声明名称,TypeScript 会将它们合并为一个实体。这使您可以执行一些强大的操作,例如为第 3 方 JavaScript 库编写声明和接口,以使它们能够识别类型。

在第一个示例中,编译器知道 的返回类型Bar(),即void。但它不知道构造函数返回什么,因此new Bar()假定为any

但是,当您声明同名的接口时,编译器会将 与 合并interface Barfunction Bar()并且该接口现在定义了一个类似于该函数的形状,因此编译器将其选择为 的类型new Bar()。请注意, 类型Bar()仍然保留void

  • 是的,但我的问题是,为什么接口的存在会改变`new Bar()`的返回类型? (2认同)