typescript - 打字稿:将类型转换为 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 和其他方法。但这是一个非常老套的解决方案。我不知道这个问题有更好更优雅的解决方案吗?
解决方案
您可以通过执行以下操作使打字稿错误消失:
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()
应该可以正常工作了。
推荐阅读
- clickhouse - 无法在 clickhouse 设置中添加设置“log_queries=1”
- python - 如何从同一文件夹导入python模块?
- excel - 特定单元格更改时自动刷新 Excel Power Query(我正在使用 VBA)
- spring - 使用 SpringJUnit4ClassRunner 将 Spring 4 迁移到 Spring 5 导致 Junit 失败
- python - 手动更改 CSV 文件上的数据导致数据显示为 NaN
- laravel - Laravel Lumen:检索服务提供者类中的请求和标头值不起作用
- node.js - 错误:内部/模块/cjs/loader.js:968 抛出错误;节点模块?
- javascript - 制表符:我正在使用验证模式手册,但如果无效,我想阻止单元格
- iis-8 - 具有自己设置的虚拟路径/应用程序
- c++ - std::filesystem::path 的奇怪运算符/