Dokumen untuk jenis tupel yang dipetakan menawarkan contoh ini:
type MapToPromise<T> = { [K in keyof T]: Promise<T[K]> };
type Coordinate = [number, number]
type PromiseCoordinate = MapToPromise<Coordinate>; // [Promise<number>, Promise<number>]
Namun bagaimana jika tupel asli saya berisi tupel lain, dan sebagai bagian dari pemetaan saya ingin mengambil nilai menarik dari tupel bagian dalam tersebut?
e.g.
// I just want the numbers, but there is other stuff in the type
type MessyCoordinate = [
[string, number],
[string, number]
]
Saya berharap saya bisa melakukan ini:
type Clean<T extends [string, number]> = T[1]
// Why doesn't this work?
type MapToClean<T> = { [K in keyof T]: Clean<T[K]> }
type CleanCoordinate = MapToClean<MessyCoordinate>; // [number, number]
Kompiler memberi saya kesalahan ini:
Type 'T[K]' does not satisfy the constraint '[string, number]'.
Type 'T[keyof T]' is not assignable to type '[string, number]'.
Type 'T[string] | T[number] | T[symbol]' is not assignable to type '[string, number]'.
Type 'T[string]' is not assignable to type '[string, number]'.(2344)
Saya dapat mencoba menambahkan lebih banyak batasan pada MapToClean
tetapi sepertinya tidak membantu:
type MapToClean2<T extends [string, number][]> = { [K in keyof T]: Clean<T[K]> }
Saya juga dapat menghilangkan tipe utilitas Clean
dan hanya melakukan ini, tetapi tidak berhasil juga:
// Why doesn't this work?
type MapToClean<T> = { [K in keyof T]: T[K][1] }
// Type '1' cannot be used to index type 'T[K]'.
type CleanCoordinate = MapToClean<MessyCoordinate>; // [number, number]
Apakah harapan mendasar saya bahwa saya harus dapat membuka tupel di dalam pemetaan itu salah? Atau apakah saya hanya melewatkan sedikit sintaks ajaib agar T[K]
terlihat seperti [string, number]
?