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:
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.
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 :