Документы для отображаемые типы кортежей предлагают следующий пример:
type MapToPromise<T> = { [K in keyof T]: Promise<T[K]> };
type Coordinate = [number, number]
type PromiseCoordinate = MapToPromise<Coordinate>; // [Promise<number>, Promise<number>]
Но что, если исходный кортеж содержит другие кортежи, и в рамках отображения я хочу извлечь интересные значения из этих внутренних кортежей?
e.g.
// I just want the numbers, but there is other stuff in the type
type MessyCoordinate = [
[string, number],
[string, number]
]
Я ожидал, что смогу сделать это:
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]
Компилятор выдает мне эту ошибку:
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)
Я могу попробовать добавить больше ограничений на MapToClean
, но это не помогает:
type MapToClean2<T extends [string, number][]> = { [K in keyof T]: Clean<T[K]> }
Я также могу избавиться от типа утилиты Clean
и просто сделать это, но это тоже не работает:
// 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]
Является ли мое фундаментальное ожидание, что я смогу взломать кортеж внутри сопоставления, ошибочно? Или мне просто не хватает какого-то волшебного синтаксиса, чтобы T[K]
выглядело как [string, number]
?