在Typescript中,为什么我需要设置定义为只读的类的属性?

时间:2016-08-03 20:10:41

标签: typescript

我有以下类定义:

class Department
{
    name: string;
    id: string;

    get prefix(): string
    {
        return  !isNaN(parseFloat(this.id)) ? "n" : "i" ;
    }
}

在我的代码中,我试着像这样使用它:

getDepartmentList(): Department[] {
    return [
        {
            "name": "Dept 1",
            "id": "1000"
        }
    ];
}

但是,我收到以下错误:

  

输入'{“name”:string; “id”:string; }'不能分配给类型   '部门'。类型'{“name”中缺少属性'prefix':string;   “id”:string; }”。

我确信真正的问题是我对Typescript缺乏了解,但有人可以解释为什么编译器将getter函数视为属性并希望我在其上设置一个值吗?

1 个答案:

答案 0 :(得分:5)

您的班级部门正在创建一个类型部门。您定义的是包含nameidprefix。您在getDepartmentList中返回的对象不包含prefix,因此它们与类型部门在结构上不兼容。因此,您会收到错误。

我猜你假设prefix - 属性可用于任何声明属于Department类型的属性。事实并非如此,没有像打字稿那样的动态类分配。你必须确保自己所说的对象是特定类型,实际上就是这种类型。

你可以这样做:

class Department
{
    constructor(public name:string, public id:string){ }

    get prefix(): string
    {
        return  !isNaN(parseFloat(this.id)) ? "n" : "i" ;
    }
}

function getDepartmentList(): Department[]
{
    return [new Department("Dept 1", "1000")];
}

在这里,您要从Department类中实例化新对象,因此这些对象都将具有前缀属性。

在构造函数签名中使用访问修饰符告诉typescript创建该参数的属性,而不是仅被视为参数。

它相当于:

class Department
{
    name: string;
    id:string;

    constructor(name:string, id:string){
        this.name = name;
        this.id = id;
    }

    get prefix(): string
    {
        return  !isNaN(parseFloat(this.id)) ? "n" : "i" ;
    }
}