我目前正在尝试将收到的 JSON 对象转换为具有相同属性的 TypeScript 类,但我无法让它工作。我究竟做错了什么?
员工类
export class Employee{
firstname: string;
lastname: string;
birthdate: Date;
maxWorkHours: number;
department: string;
permissions: string;
typeOfEmployee: string;
note: string;
lastUpdate: Date;
}
员工字符串
{
"department": "<anystring>",
"typeOfEmployee": "<anystring>",
"firstname": "<anystring>",
"lastname": "<anystring>",
"birthdate": "<anydate>",
"maxWorkHours": <anynumber>,
"username": "<anystring>",
"permissions": "<anystring>",
"lastUpdate": "<anydate>"
//I will add note later
}
我的尝试
let e: Employee = new Employee();
Object.assign(e, {
"department": "<anystring>",
"typeOfEmployee": "<anystring>",
"firstname": "<anystring>",
"lastname": "<anystring>",
"birthdate": "<anydate>",
"maxWorkHours": 3,
"username": "<anystring>",
"permissions": "<anystring>",
"lastUpdate": "<anydate>"
});
console.log(e);
原文由 moessi774 发布,翻译遵循 CC BY-SA 4.0 许可协议
编译器允许您将从
JSON.parse
返回的对象转换为类的原因是因为 typescript 基于结构子类型。您实际上并没有
Employee
的实例,您有一个具有相同属性的对象(如您在控制台中看到的)。一个更简单的例子:
( 操场上的代码)
没有错误,因为
a1
满足类型A
因为它具有所有属性,并且logA
函数即使没有运行时错误也可以调用不是A
的实例,只要它具有相同的属性。当你的类是简单的数据对象并且没有方法时,这很有效,但是一旦你引入了方法,事情往往会中断:
( 操场上的代码%3B%20%2F%2F%20Error%3A%20Uncaught%20TypeError%3A%20a2.multiplyBy%20is%20not%20a%20function))
编辑
这工作得很好:
( 操场上的代码%3B%0Aconsole.log(employee1)%3B))
如果您尝试在对象不是字符串时使用
JSON.parse
:然后你会得到错误,因为它不是一个字符串,它是一个对象,如果你已经以这种形式拥有它,那么就没有必要使用
JSON.parse
。但是,正如我所写的,如果您采用这种方式,那么您将没有该类的实例,而只是一个与类成员具有相同属性的对象。
如果你想要一个实例,那么: