让我们分析下面的代码片段:
class Human {
private name: string;
constructor(name){
this.name = name;
}
}
let h = new Human(5)
以上代码 不会 抛出任何错误。而且我希望它能在构造函数调用中抛出5
。
似乎构造函数的name
参数被推断为any
,其中,静态地很容易发现我将其分配给private name: string
。
问题是:在这种情况下,TypeScript是否允许5
- 或换句话说 - 将name
推断为any
是否有任何特殊原因很明显它必须是一个字符串?
我知道我可以做另外一个类定义:
class Human {
constructor(
private name: string
){}
}
但是我在这里指定参数类型,所以这里没有推论。我可以这样做:
class Human {
private name: string;
constructor(name: string){
this.name = name;
}
}
并且也没有推论。我的问题是关于推理 - 为什么它以这种方式工作。
答案 0 :(得分:2)
有一个特定的编译器选项noImplicitAny
专门用于解决此问题。如果没有"noImplicitAny": true
,则name
会被推断为any
,因此当number
通过时,它不会抱怨。
为什么这样工作?
答案 1 :(得分:1)
contructor(name)声明等于构造函数(name:any)。然后,this.name = name赋值无缝地工作,因为TS与普通JS向后兼容:当您将“any”值分配给强类型var时,TS假定您知道自己在做什么。因此,数字和字符串之间的转换不受TS控制和责任的限制。
答案 2 :(得分:0)
我认为这是模棱两可和计算复杂性的问题。
首先,涵盖大多数情况的简单规则是最好的。这意味着语言的语法很简单,新手很容易学习它,也很容易维护编译器本身。
然后,可能存在一些极端情况,其中通过其使用推断出一种类型的参数需要大量遍历,因此代码中的拼写错误会降低编译速度。
此外,构造函数是一个类型的外部接口,由应用程序的其他部分使用,因此它应该明确和安全。如果你的界面隐含地依赖于实际的实现,你可能会在重构期间意外地改变某些东西并获得难以发现的错误。