除非与接口合并,否则在函数上使用新函数将不起作用。 为什么?
这一切都假设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 Bar
和function 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?