typescript class 构造函数参数推断为任何
typescript class constructor parameter inferred as any
让我们分析下面的代码片段:
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 定义:
class Human {
constructor(
private name: string
){}
}
但是这里我指定了参数类型,所以这里没有推论。我可以这样做:
class Human {
private name: string;
constructor(name: string){
this.name = name;
}
}
而且也不会有推论。我的问题是关于推理 - 为什么它以这种方式工作。
contructor( name ) 声明等于 constructor( name: any )。然后, this.name = name 赋值无缝地工作只是因为 TS 与纯 JS 向后兼容:当您将 'any' 值赋给强类型 var 时,TS 假设您知道自己在做什么。因此,数字和字符串之间的转换不在 TS 的控制和责任范围内。
有一个特定的编译器选项 noImplicitAny
专门用于解决这个问题。如果没有 "noImplicitAny": true
,您的 name
将被推断为 any
,因此在传递 number
时它不会抱怨。
Why it works this way?
我认为这是一个模糊性和计算复杂性的问题。
首先,覆盖大部分情况的简单规则是最好的。这意味着该语言的语法简单,对于新手来说很容易学习,也很容易维护编译器本身。
然后,可能会出现极端情况,通过其用法推断参数的类型需要大量遍历,因此代码中的拼写错误可能会减慢编译速度。
此外,构造函数是应用程序其他部分使用的类型的外部接口,因此为了清晰和安全起见,它应该是显式的。如果您的接口隐式依赖于实际实现,您可能会在重构过程中意外更改某些内容并导致难以检测的错误。
让我们分析下面的代码片段:
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 定义:
class Human {
constructor(
private name: string
){}
}
但是这里我指定了参数类型,所以这里没有推论。我可以这样做:
class Human {
private name: string;
constructor(name: string){
this.name = name;
}
}
而且也不会有推论。我的问题是关于推理 - 为什么它以这种方式工作。
contructor( name ) 声明等于 constructor( name: any )。然后, this.name = name 赋值无缝地工作只是因为 TS 与纯 JS 向后兼容:当您将 'any' 值赋给强类型 var 时,TS 假设您知道自己在做什么。因此,数字和字符串之间的转换不在 TS 的控制和责任范围内。
有一个特定的编译器选项 noImplicitAny
专门用于解决这个问题。如果没有 "noImplicitAny": true
,您的 name
将被推断为 any
,因此在传递 number
时它不会抱怨。
Why it works this way?
我认为这是一个模糊性和计算复杂性的问题。
首先,覆盖大部分情况的简单规则是最好的。这意味着该语言的语法简单,对于新手来说很容易学习,也很容易维护编译器本身。
然后,可能会出现极端情况,通过其用法推断参数的类型需要大量遍历,因此代码中的拼写错误可能会减慢编译速度。
此外,构造函数是应用程序其他部分使用的类型的外部接口,因此为了清晰和安全起见,它应该是显式的。如果您的接口隐式依赖于实际实现,您可能会在重构过程中意外更改某些内容并导致难以检测的错误。