首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TypeScript构造函数类型安全

TypeScript构造函数类型安全
EN

Stack Overflow用户
提问于 2016-03-14 15:25:58
回答 2查看 276关注 0票数 0

为什么下面的代码在变量id被声明为数字时,当在构造函数中被分配一个字符串时,编译得很好?

代码语言:javascript
复制
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);

}

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-14 16:25:16

简单回答..。因为它没有被分配一个字符串,所以它被分配了一个any类型的变量。

代码语言:javascript
复制
this.id = idArg;

any类型意味着值“可以视为任何类型”。因此,当编译器询问“我能否将any分配给number”时,答案是“是”。

可以使用联合类型缩小构造函数中的类型(并消除重载,这总是一件积极的事情):

代码语言:javascript
复制
class ComplexType implements IComplexType{
    id: number;
    name: string;
    constructor(idArg: string | number, nameArg: string){
        this.id = idArg;
        this.name = nameArg;
    }
}

这样做的另一个好处是告诉您赋值是一个可能的错误,这将迫使您更新签名(要么解析字符串中的数字,要么在提供字符串时做您想做的事情)。

示例的关键部分是string | number,它表示类型要么是字符串,要么是数字,这比any更有限制性。

票数 2
EN

Stack Overflow用户

发布于 2016-03-14 15:44:26

类型记录编译成JavaScript,这实际上不支持函数重载。只在编译类型检查时使用重载声明。

这个构造函数

代码语言:javascript
复制
constructor(idArg: any, nameArg: any){
    this.id = idArg;
    this.name = nameArg;
}

允许传递任何类型的参数,因此允许字符串。

在构造函数内部,传递的值被分配给类属性。由于这是JavaScript,所以在这次操作中没有发生任何类型的铸造。

您可以找到“TypeScript中的构造函数重载”,并找到例如,以获得更多细节和可能的解决方案。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35991529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档