将JSON转换为TypeScript对象的最佳方法是什么?

时间:2018-06-28 08:15:52

标签: typescript

我有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
    );
};

这就是我的问题

  1. 这是一个完美的解决方案吗?
  2. 有没有比这更好的解决方案了?
  3. TypeScript中是否有内置解决方案?

1 个答案:

答案 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那样动态地更改构造函数,这会将对象转换为类的实例,但不一定会表现更好。