[英]Typescript complaining about not assigning a get property
我有这个代码stackblitz
export class Student {
id: number;
name: string;
age?:number;
get studentType():string {
return 'fullTime'
}
constructor(params: Student) {
Object.assign(this, params);
}
}
const student = new Student({id:1, name: 'Jon'}); //ts error here
我收到以下错误
类型'{{id:number; 名称:字符串; }”不能分配给“学生”类型的参数。 类型'{id:number;缺少属性'studentType'。 名称:字符串; }”。
虽然studentType是仅获取属性,无法下注设置。
原因是什么,我该如何解决?
PS。 (我不想像studentType?
那样使它为可空值或将其转换为一个函数)
Getters / Setters与常规属性完全一样,这就是为什么Typescript不能区分getter / setter和常规属性。 您可以将所有属性设置为可选,从而可以省略studentType
:
constructor(params: Partial<Student>) {
Object.assign(this, params);
}
但是,其他属性(例如name
)现在也可以省略。 为了提高类型安全性,您可以引入其他接口:
export interface StudentData {
id: number;
name: string;
age?:number;
}
export class Student implements StudentData {
get studentType():string {
return 'fullTime'
}
constructor(params: StudentData) {
Object.assign(this, params);
}
}
在TypeScript中,这是一个更具争议性的话题。 对于类,TypeScript将类的整体形状视为类型。
这包括私有变量和方法,在这种情况下,包括getter / setter。
解决问题的一种方法是可以使用Partial<>
constructor(params: Partial<Student>) { ... }
或Pick<>
constructor(params: Pick<Student, 'id' | 'name' | 'age'>) { ... }
另一种方法是自己创建一个接口:
interface IStudent { id: number, name: string, age?:number }
class Student implements IStudent {
constructor(params: IStudent) { ... }
}
是什么原因呢?
基本上, {id:1, name: 'Jon'}
不是学生,因为该对象缺少studentType
属性。 这似乎很明显而且很愚蠢,但是很有意义,因为打字稿无法知道您是否要依赖该参数的属性。
在构造函数中,只需调用Object.assign
并放手即可。 但是您可能正在调用实际上依赖于具有该属性的参数的某些函数,如果打字稿未指出,则可能导致运行时错误。
以及我该如何解决?
好吧,已经有几个答案了。 我只需要正确输入构造函数参数即可。 如果您希望对象具有ID,名称和/或年龄,则可以相应地输入:
export class Student {
id: number;
name: string;
age?:number;
get studentType():string {
return 'fullTime'
}
constructor(params: {id: number, name: string, age?: number}) {
Object.assign(this, params);
}
}
const student = new Student({id:1, name: 'Jon'}); //ts error here
这是因为您将构造函数中的类型指定为Student。 可以这样做:
export class Student {
id: number;
name: string;
age?: number;
constructor(id:number, name:string,age?:number) {
this.age = age;
this.name = name;
this.id = id;
}
get studentType():string {
return 'fullTime'
}
}
const student = new Student(1, 'Jon');
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.