我有JSON
字符串
const json = '{ "first_name": "John", "last_name": "Doe"}';
和一个类User
class User {
constructor(
public first_name: string,
public last_name: string
) {
}
public getFullName = (): string => {
return this.first_name + ' ' + this.last_name;
};
}
当我尝试这个
const user: User = JSON.parse(json);
console.log(user.first_name); // Works, prints "John"
console.log(user.last_name); // Works, prints "Doe"
console.log(user.getFullName()); //Error: TypeError: user.getFullName is not a function
我知道发生了错误,因为JSON.parse
仅与User
类型匹配,但与其中的方法不匹配。
因此,为了解决此问题,我在fromJSON
类中编写了一个User
静态方法来进行手动解析,
public static fromJSON = (json: string): User => {
const jsonObject = JSON.parse(json);
return new User(
jsonObject.first_name,
jsonObject.last_name
);
};
这就是我的问题
TypeScript
中是否有内置解决方案?答案 0 :(得分:1)
这是一个不错的解决方案。更好的方法是使用Object.assign
,这样就不必写所有分配,因为如果有很多属性,这个分配会失去控制,但是任何一个都可以正常工作。
class User {
public first_name!: string;
public last_name!: string;
constructor(data: Partial<User>) {
Object.assign(this, data);
}
public getFullName (): string {
return this.first_name + ' ' + this.last_name;
};
public static fromJSON = (json: string): User => {
const jsonObject = JSON.parse(json);
return new User(jsonObject);
};
}
在打字稿中没有内置解决方案,Object.assign
是最接近它的解决方案。您可能会考虑像详细here那样动态地更改构造函数,这会将对象转换为类的实例,但不一定会表现更好。