Andaikan saya ada function foo(args) {...}
,其中args
是一个二元组数组,这样元组中的条目是相同类型的(即[T,T]
),但是跨元组的条目可能任意变化(即[[T,T], [U,U],[V,V]]
). Contohnya:
foo([ [1, 3], ["hello", "world"], [true, true], [2, 7] ]) // no error
Bagaimanakah saya harus memasukkan parameter foo
的 args
supaya jenis yang tidak sepadan dalam tuple menimbulkan ralat jenis masa kompilasi? Contohnya:
foo([ [1, 3], ["hello", 5], // type error here [true, true], [2, 7n] // type error here ])
Jika ralat jenis tidak dapat ditunjukkan sebaris, ia juga boleh diterima untuk menjadikan keseluruhan panggilan fungsi salah.
Lampiran: Adakah ia tersedia [SomeType
类型的 2 元组(即第二个条目的类型应与第一个),但 T 仍然可以在元组之间变化 [[SomeType
?
foo([ [{value: 1}, 3], [{value: "hello"}, 5], // type error here [{value: true}, true], [{value: 2}, 7n] // type error here ])
Saya rasa anda boleh lulus sebagai
row
创建一个类型来简单地实现此目的,该类型将接受string
、number
或 布尔值.类型 Row = string[] |布尔值[] |数字[]
Kini kita boleh menetapkan jenis ini kepada parameter
foo
函数的args
.Menggunakan takrif jenis ini, TypeScript akan membuang ralat jika anda memberikan hujah kepada
foo
di mana jenis elemen dalam baris tidak sepadan.Ini adalah taman permainan
Pautan代码>
.Untuk mencapai ini, kita perlu menggunakan generiktatasusunan dan jenis yang dipetakan untuk memetakan elemen tatasusunan. Memandangkan kita tahu bahawa tatasusunan mestilah tatasusunan tupel dengan panjang 2, kita akan membuat kesimpulan parameter generik untuk item pertama dalam tupel dan menjadikan item kedua mempunyai jenis yang sama. Untuk mendapatkan jenis parameter generik, kita perlu menggunakan kata kunci Infer. Ambil perhatian bahawa kita perlu mengetahui dengan tepat (atau sekurang-kurangnya jenis bentuk yang serupa) jenis generik yang digunakan untuk menjadikannya berfungsi, yang dalam kes kita ialah
Variable
:Ia mungkin kelihatan seperti itu sahaja, tetapi mari lihat jenis tatasusunan berikut:
Seperti yang anda lihat, jenisnya tidak sama persis dengan apa yang kita ada dalam arr. Pengkompil memanjangkan jenis untuk memastikan kita boleh menukar elemen tatasusunan. Untuk memberitahu pengkompil bahawa tatasusunan adalah baca sahaja, kita perlu menggunakan konst penegasan:
Nampak baik sekarang, ini bermakna kita perlu menetapkan tatasusunan yang dihantar kepada
foo
sebagai baca sahaja`, dan memandangkan tatasusunan baca sahaja ialah superset tatasusunan boleh ubah yang akan kita perolehi jika kita cuba menghantar tatasusunan baca sahaja kepada tatasusunan, Ralat akan muncul:Jadi kami mengemas kini semua jenis tatasusunan dalam
foo
untuk dibaca sahaja. Ambil perhatian bahawa memandangkan tatasusunan kami ialah 2D, tatasusunan dalam juga akan dibaca sahaja dan kekangan tatasusunan hendaklah tatasusunan baca sahaja tatasusunan baca sahaja:Ujian:
Namun, kami masih menghadapi beberapa masalah. Contohnya, jika elemen pertama dalam tupel ialah primitif
Variable
,则意味着第二个参数也应该是7
,而不是任何数字,如果这是一个问题我们需要获取7
, iaitu nombor. Ini boleh dilakukan menggunakan jenis utiliti ToPrimitive daripada projek sumber terbuka type-samurai saya: p>Ciri yang dikemas kini:
Masalah lain ialah jika jenis yang disimpulkan dalam pelaksanaannombor[]
, kami tidak akan membenarkan tatasusunan baca sahaja:foo
实现中推断的类型是number[]
semasa kami ialahBahagian yang menjengkelkan ialah kita perlu menggunakan
const 断言
。在 Typescript5.0
中,const 类型参数,这样我们就可以避免const 断言
di mana-mana:Malangnya kami tidak boleh menggunakannya kerana kami melakukan sesuatu dengan parameter dan bukannya memberikan terus
T
kepadanya sebagai jenis:Apa pun, pada masa ini,
const 断言
adalah satu-satunya cara untuk memastikan ia berfungsi seperti yang diharapkan.Pautan ke Taman Permainan