Saya memiliki Antarmuka seperti:

export interface Person {
  name: string;
  isMillenial: boolean;
}

Dan fungsi yang menampilkan antarmuka itu seperti:

function makePerson(name: string, birthYear: number): Person {
  let newPerson = {
    name
  }

  // Calculate various properties, slowly building up the `newPerson` object
  newPerson.isMillenial = birthYear < 1981

  return newPerson
}

Namun ini akan gagal dengan kesalahan seperti:

Properti 'isMillenial' tidak ada dalam tipe '{ name: string }' tetapi diperlukan dalam tipe 'Person '.

Saya tahu saya dapat mendeklarasikan semua properti newPerson saat saya membuatnya, agar sesuai dengan apa yang diharapkan - tetapi Saya ingin membangun objek yang saya buat secara bertahap, menambahkan properti hingga objek selesai. Apakah ada cara saya dapat membangun objek secara bertahap dalam TypeScript sambil tetap memenuhi pemeriksaan tipe?

(Jika jawabannya 'tidak, Anda perlu default', itu jawaban yang dapat diterima)

1
mikemaccana 12 Mei 2021, 16:14

1 menjawab

Jawaban Terbaik

Ya, tetapi Anda harus mendeklarasikannya secara berbeda, dan Anda mungkin harus memberi tahu TypeScript ketika Anda telah menyelesaikan objek. Partial Jenis utilitas membuat jenis utilitas berbasis pada tipe lain yang menjadikan semua propertinya opsional. Begitu:

function makePerson(name: string, birthYear: number): Person {
    let newPerson: Partial<Person> = {
    // −−−−−−−−−−−−^^^^^^^^^^^^^^^
        name
    };

    // Calculate various properties, slowly building up the `newPerson` object
    newPerson.isMillenial = birthYear < 1981;

    return newPerson as Person;
    // −−−−−−−−−−−−−−^^^^^^^^^
}

Sayangnya penegasan tipe di akhir diperlukan (yang mengejutkan saya, Anda dapat mengetahui dari atas bahwa tidak ada properti yang akan menjadi undefined pada akhirnya, tetapi tim TypeScript harus membatasi seberapa pintar kompiler untuk menjaganya agar tidak terlalu lambat).

Tautan taman bermain

as Person saat pengembalian juga berarti Anda dapat membiarkannya dari tanda tangan deklarasi fungsi jika Anda mau, TypeScript akan mengetahui tipe pengembalian fungsi:

function makePerson(name: string, birthYear: number): Person {
// Optional as far as TypeScript is concerned −−−−−−^^^^^^^^

...meskipun Anda mungkin ingin membiarkannya di sana jika fungsinya lebih dari beberapa baris, untuk memastikan bahwa Anda tidak menambahkan return baru di tempat lain yang mengubah tipe pengembalian.


Anda menyebutkannya dalam pertanyaan, tetapi saya akan menekankannya hanya untuk apa nilainya (dan untuk yang mengintai) bahwa Anda dapat membangun informasi yang akan Anda gunakan untuk membuat objek, lalu buat objek sekaligus untuk disimpan membutuhkan anotasi tipe. Itu menyederhanakan contoh sedikit, meskipun tentu saja kode nyata mungkin tidak menjadi lebih sederhana:

function makePerson(name: string, birthYear: number): Person {
    const isMillenial = birthYear < 1981;
    return {name, isMillenial};
}

Itu tidak selalu layak, tetapi ketika itu saya merasa berguna.

1
T.J. Crowder 12 Mei 2021, 13:30