为什么下面的代码在变量id被声明为数字时,当在构造函数中被分配一个字符串时,编译得很好?
interface IComplexType{
id: number;
name: string;
}
class ComplexType implements IComplexType{
id: number;
name: string;
constructor(idArg: number, nameArg: string);
constructor(idArg: string, nameArg: string);
constructor(idArg: any, nameArg: any){
this.id = idArg;
this.name = nameArg;
}
}
window.onload = () =>{
var complexType: ComplexType = new ComplexType("hi","hi");
console.log(complexType.id);
}谢谢!
发布于 2016-03-14 16:25:16
简单回答..。因为它没有被分配一个字符串,所以它被分配了一个any类型的变量。
this.id = idArg;any类型意味着值“可以视为任何类型”。因此,当编译器询问“我能否将any分配给number”时,答案是“是”。
可以使用联合类型缩小构造函数中的类型(并消除重载,这总是一件积极的事情):
class ComplexType implements IComplexType{
id: number;
name: string;
constructor(idArg: string | number, nameArg: string){
this.id = idArg;
this.name = nameArg;
}
}这样做的另一个好处是告诉您赋值是一个可能的错误,这将迫使您更新签名(要么解析字符串中的数字,要么在提供字符串时做您想做的事情)。
示例的关键部分是string | number,它表示类型要么是字符串,要么是数字,这比any更有限制性。
发布于 2016-03-14 15:44:26
类型记录编译成JavaScript,这实际上不支持函数重载。只在编译类型检查时使用重载声明。
这个构造函数
constructor(idArg: any, nameArg: any){
this.id = idArg;
this.name = nameArg;
}允许传递任何类型的参数,因此允许字符串。
在构造函数内部,传递的值被分配给类属性。由于这是JavaScript,所以在这次操作中没有发生任何类型的铸造。
您可以找到“TypeScript中的构造函数重载”,并找到例如这,以获得更多细节和可能的解决方案。
https://stackoverflow.com/questions/35991529
复制相似问题