Saya memiliki Kelas ini yang saya gunakan untuk mengimpor data dari file json:

import Players from './players.json';

class Player {
  name: string;
}

const PLAYERS: Player[] = Players;

Ini bekerja dengan baik. Tetapi segera setelah saya menambahkan metode pengambil seperti:

class Player {
  name: string;

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

Kemudian saya mendapatkan kesalahan pada baris const PLAYERS karena Property 'getName' is missing in type. Yang bisa dimengerti: Objek json tidak memiliki properti getName, sehingga menjadi tidak kompatibel. Solusi pertama yang dapat saya pikirkan adalah membuat Kelas kedua untuk membungkus Kelas pertama, menggunakan satu kelas untuk mengimpor data json dan membuat pengambil dan metode lain di kelas kedua. Tapi itu benar-benar solusi hacky. Apakah ada solusi yang lebih baik dan lebih elegan untuk masalah ini yang tidak saya ketahui?

1
VIBrunazo 9 Agustus 2019, 23:21

1 menjawab

Jawaban Terbaik

Anda dapat menghilangkan kesalahan TypeScript hanya dengan melakukan:

const PLAYERS: Player[] = Players as any;

Namun, melakukan PLAYERS[0].getName() akan gagal, jadi mungkin bukan itu yang Anda inginkan.

Cara normal untuk melakukan ini adalah menetapkan ke tipe baru. Backend Anda (atau file JSON) mengembalikan Player[], dan kemudian Anda perlu mengubahnya menjadi tipe baru. Bisa sesederhana:

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

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

Kemudian Anda akan melakukan:

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

Dan sekarang PLAYERS[0].getName() akan berfungsi dengan baik.

1
Mordred 9 Agustus 2019, 20:31