当前位置: 首页 > 知识库问答 >
问题:

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

宗政学
2023-03-14

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

class Human {
    private name: string;
    constructor(name){
        this.name = name;
    }
}

let h = new Human(5)

以上代码不会引发任何错误。我希望它会抛出构造函数调用,在这里我传递5。

似乎构造函数的name参数被推断为any,其中,静态地很容易发现我将其分配给私有名称:string

问题是:TypeScript在这里允许5,或者换言之,名称被推断为任何,而在这种情况下,很明显它必须是一个字符串,这有什么特殊的原因吗?

我知道我可以做另一个这样的类定义:

class Human {
    constructor(
        private name: string
    ){}
}

但这里我指定了参数类型,所以这里没有推断。我也可以这样做:

class Human {
    private name: string;
    constructor(name: string){
        this.name = name;
    }
}

也不会有任何推论。我的问题是关于推理——为什么它是这样工作的。

共有3个答案

谈阎宝
2023-03-14

我认为这是一个模糊性和计算复杂性的问题。

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

然后,可能会出现一些极端情况,即根据参数的用法推断参数类型需要大量遍历,因此代码中的键入可能会减慢编译速度。

此外,构造函数是应用程序其他部分使用的类型的外部接口,因此为了清晰和安全,它应该是显式的。如果您的接口隐式地依赖于实际实现,您可能会在重构期间意外更改某些内容并获得难以检测的错误。

壤驷志学
2023-03-14

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

楚俊杰
2023-03-14

有一个特定的编译器选项专门解决这个问题。如果没有“noImplicitAny”:true,则您的姓名将被推断为任何代码,因此在传递编号时不会抱怨。

为什么会这样?

看看这个和这个。

 类似资料:
  • 我有一个类,它有一些属性/方法,返回最初通过构造函数传递的值: 人们建议用泛型作为打字稿的等价物: 现在我有了一个子类,它调用超类的构造函数并传递以下选项: TypeScript编译器对此不满意,希望通过类型扩展Base类。但是我有两次信息,在超级呼叫和扩展符号中。什么是正确的ts语法来解决我的问题? (键入脚本中的代码)

  • Kotlin中的参数与Java中有些不同。如你所见,我们先写参数的名字再写它的类型: fun add(x: Int, y: Int) : Int { return x + y } 我们可以给参数指定一个默认值使得它们变得可选,这是非常有帮助的。这里有一个例子,在Activity中创建了一个函数用来toast一段信息: fun toast(message: String, length: I

  • 问题内容: 我有两个类,和,扩展了前一个类。 具有以下构造函数: 我将注意到所有实例变量都已设置为private。 同时,具有以下构造函数: 但是,这为我的构造函数引发了“找不到符号”错误。 我尝试使用,但是我的超类的私有范围阻止了这种情况。 我发现向我的构造函数中添加字段并允许我调用超级构造函数,但是我想知道是否存在一种无需在子类构造函数中传递其所有参数的情况下调用超级构造函数的方法? 问题答案

  • TypeScript中非抽象类(非抽象构造函数)的类型签名如下: 这也称为可更新类型。但是,我需要一个抽象类(抽象构造函数)的类型签名。我理解它可以定义为具有类型,但这太宽泛了。难道没有更精确的替代方案吗? 编辑: 为了阐明我的意思,下面的小片段演示了抽象构造函数和非抽象构造函数之间的区别: 类型'typeof实用程序'不能分配给类型'new(... args: any[])= 无法将抽象构造函数

  • 我正在尝试通过:如果流文件; 在我的主()中,到一个名为“FIFO”的类的构造函数:FIFO(文件); 在FIFO(FIFO.h)的头文件中,我有: 在FIFO.cc,我有: 我一直喜欢(还有更多,我只是粘贴其中一个): 在文件包括从/usr/lib/gcc/x86_64-redhat linux/4.4.7/…/…/…/…/包含/c /4.4.7/bits/localefwd.h: 43,从/u

  • 我正在浏览hibernate留档,文档说hibernate需要为我们所有的持久类提供一个no-arg构造函数: 无参数构造函数是所有持久类的要求;Hibernate必须使用Java反射为您创建对象。构造器可以是私有的,但是在没有字节码插装的情况下,运行时代理生成和有效的数据检索需要包或公共可见性。 但是当我通过创建一个没有任何无参数构造函数的POJO类并放置一个接受参数的构造函数来创建一个示例程序