Typescript: Mentransmisikan array ke union + tipe array yang dipetakan tidak mempertahankan urutan tipe

Dibuat pada 7 Mei 2019  ·  1Komentar  ·  Sumber: microsoft/TypeScript


Versi TypeScript: 3.4.0-dev.201xxxxx


Istilah Pencarian:

Jenis yang dipetakan urutan kunci hilang

Kode

type Initial = [1, 2, 3, 4]

type FindReplace<T extends any[], Find, Replace> = {
  [K in keyof T]: T[K] extends Find ? Replace : T[K]
}

// Map over array and replace '2'
type ResultArray = FindReplace<Initial, 2, 'was 2'>
// => [1, "was 2", 3, 4]

// Now accessing the array values using [number], the type
// order is lost. This matters because now when the union is later
// cast as a intersection, the types are in the wrong order
type Result = ResultArray[number]
// => 1 | 3 | 4 | "was 2

Perilaku yang diharapkan:

Pemetaan jenis harus mempertahankan urutan kunci

Perilaku sebenarnya:

Pemetaan jenis mempertahankan "jenis", tetapi urutan kunci hilang saat menjalankan operator T[keyof T]

Masalah Terkait:

Question

Komentar yang paling membantu

Urutan serikat bukanlah sesuatu yang harus Anda andalkan untuk apa pun. @RyanCavanaugh menyebutkan ini ketika serikat pekerja dengan tuple dibahas di sini :

Pertama, tatanan serikat bukanlah sesuatu yang bisa kita izinkan untuk diamati. Secara internal, serikat pekerja disimpan sebagai daftar jenis yang diurutkan (ini adalah satu-satunya cara efisien untuk dengan cepat menentukan hubungan di antara mereka), dan kunci pengurutan adalah ID internal yang dihasilkan secara bertahap. Hasil praktis dari ini adalah bahwa dua program yang sangat mirip dapat menghasilkan urutan gabungan yang sangat berbeda, dan gabungan yang sama yang diamati dalam konteks layanan bahasa mungkin memiliki urutan yang berbeda daripada saat diamati dalam konteks baris perintah, karena urutan pembuatan tipe adalah hanya urutan pemeriksaannya.

>Semua komentar

Urutan serikat bukanlah sesuatu yang harus Anda andalkan untuk apa pun. @RyanCavanaugh menyebutkan ini ketika serikat pekerja dengan tuple dibahas di sini :

Pertama, tatanan serikat bukanlah sesuatu yang bisa kita izinkan untuk diamati. Secara internal, serikat pekerja disimpan sebagai daftar jenis yang diurutkan (ini adalah satu-satunya cara efisien untuk dengan cepat menentukan hubungan di antara mereka), dan kunci pengurutan adalah ID internal yang dihasilkan secara bertahap. Hasil praktis dari ini adalah bahwa dua program yang sangat mirip dapat menghasilkan urutan gabungan yang sangat berbeda, dan gabungan yang sama yang diamati dalam konteks layanan bahasa mungkin memiliki urutan yang berbeda daripada saat diamati dalam konteks baris perintah, karena urutan pembuatan tipe adalah hanya urutan pemeriksaannya.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat