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

这一切都假设noImplicityAny设置为true

鉴于这种:

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

这不起作用:

let x = new Bar();

你得到的错误是:

'新'表达式,其目标缺少构造签名,隐含有'任何'类型。

好的,我想这种说法是有道理的。

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

interface Bar { 
     f: number;
}

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

let x = new Bar();
console.log(x.f);

当你将鼠标悬停在Bar你会看到这个类型:

interface Bar function Bar(): void

所以我知道有一些合并正在进行。 我只是不清楚为什么现在可以工作? 究竟这是什么新合并的类型,为什么是的返回类型Bar()不再被暗示是功能的any


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

在你的第一个例子中,编译器知道Bar()的返回类型,它是void 。 它不知道什么构造函数返回,所以new Bar()被假定为any

但是,当你声明一个同名的接口时,编译器会将interface Barfunction Bar()合并,现在接口定义了一个类似函数的形状,所以编译器会将它作为new Bar()的类型。 请注意, Bar()类型仍然void


TypeScript类型系统确实知道这是一个新的构造函数。

您可以将其定义为单个类,而不是函数和接口。

class Bar {
  f = 100;
} 

let x = new Bar();
console.log(x.f);

如果您的目标是es5,则生成的代码基本上与问题中的构造函数相同。

链接地址: http://www.djcxy.com/p/37923.html

上一篇: Using new on a function doesn't work unless merged with an interface. Why?

下一篇: Where should I store my secret keys for my Node.js app?