typescript类构造函数参数推断为any

时间:2017-06-02 10:10:28

标签: typescript constructor type-inference

让我们分析下面的代码片段:

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;
    }
}

并且也没有推论。我的问题是关于推理 - 为什么它以这种方式工作。

3 个答案:

答案 0 :(得分:2)

有一个特定的编译器选项noImplicitAny专门用于解决此问题。如果没有"noImplicitAny": true,则name会被推断为any,因此当number通过时,它不会抱怨。

  

为什么这样工作?

请参阅thisthis

答案 1 :(得分:1)

contructor(name)声明等于构造函数(name:any)。然后,this.name = name赋值无缝地工作,因为TS与普通JS向后兼容:当您将“any”值分配给强类型var时,TS假定您知道自己在做什么。因此,数字和字符串之间的转换不受TS控制和责任的限制。

答案 2 :(得分:0)

我认为这是模棱两可和计算复杂性的问题。

首先,涵盖大多数情况的简单规则是最好的。这意味着语言的语法很简单,新手很容易学习它,也很容易维护编译器本身。

然后,可能存在一些极端情况,其中通过其使用推断出一种类型的参数需要大量遍历,因此代码中的拼写错误会降低编译速度。

此外,构造函数是一个类型的外部接口,由应用程序的其他部分使用,因此它应该明确和安全。如果你的界面隐含地依赖于实际的实现,你可能会在重构期间意外地改变某些东西并获得难以发现的错误。