我有以下类定义:
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函数视为属性并希望我在其上设置一个值吗?
答案 0 :(得分:5)
您的班级部门正在创建一个类型部门。您定义的是包含name
,id
和prefix
。您在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" ;
}
}