这是假设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?
您正在经历的是TypeScript 中的声明合并。基本上,如果两个实体具有相同的声明名称,TypeScript 会将它们合并为一个实体。这使您可以执行一些强大的操作,例如为第 3 方 JavaScript 库编写声明和接口,以使它们能够识别类型。
在第一个示例中,编译器知道 的返回类型Bar(),即void。但它不知道构造函数返回什么,因此new Bar()假定为any。
但是,当您声明同名的接口时,编译器会将 与 合并interface Bar,function Bar()并且该接口现在定义了一个类似于该函数的形状,因此编译器将其选择为 的类型new Bar()。请注意, 类型Bar()仍然保留void。
| 归档时间: |
|
| 查看次数: |
145 次 |
| 最近记录: |