首页 > 解决方案 > 打字稿:将类型转换为 json 对象时,“类型中缺少属性 getName”

问题描述

我有这个类,用于从 json 文件中导入数据:

import Players from './players.json';

class Player {
  name: string;
}

const PLAYERS: Player[] = Players;

这工作得很好。但是一旦我添加了一个像这样的getter方法:

class Player {
  name: string;

  getName(): string {
    return this.name;
  }
}

然后我在线上出现错误,const PLAYERS因为Property 'getName' is missing in type. 这是可以理解的: json 对象没有 getName 属性,因此它变得不兼容。我能想到的第一个解决方法是创建第二个类来包裹第一个类,使用一个类导入 json 数据并在第二个类上创建 getter 和其他方法。但这是一个非常老套的解决方案。我不知道这个问题有更好更优雅的解决方案吗?

标签: typescript

解决方案


您可以通过执行以下操作使打字稿错误消失:

const PLAYERS: Player[] = Players as any;

但是,做PLAYERS[0].getName()会失败,所以这可能不是你想要的。

这样做的正常方法是分配给一个新类型。您的后端(或 JSON 文件)返回 Player[],然后您需要将其转换为新类型。可以很简单:

class PlayerModel {
    name: string;
    getName(): string {
        return this.name;
    }

    constructor(data: Player) {
        Object.assign(this, data);
        // any other stuff you need to do here
    }
}

然后你会这样做:

const PLAYERS: PlayerModel[] = Players.map(p => new PlayerModel(p));

现在PLAYERS[0].getName()应该可以正常工作了。


推荐阅读