Уникальный синтаксис Typescript, относящийся к условным шаблонам и массивам - PullRequest
0 голосов
/ 28 января 2019

Я наткнулся на определенный синтаксис Typescript, который я нахожу запутанным.Вот два примера, которые были написаны членами команды Typescript.

Пример 1

type BoxedArray<T> = { array: T[] };
type Boxed<T> = T extends any[] ? BoxedArray<T[number]> : BoxedValue<T>;
type T21 = Boxed<number[]>;  // BoxedArray<number>;

source

Вот как я наивно прочел это:

// Boxed receives a type parameter - T = number[]
// Boxed passes BoxedArray an Array of T
// Therefore type T21 = BoxedArray<number[][]>

Пример 2

type DeepReadonly<T> =
    T extends any[] ? DeepReadonlyArray<T[number]> :
    T extends object ? DeepReadonlyObject<T> :
    T;

interface DeepReadonlyArray<T> extends ReadonlyArray<DeepReadonly<T>> {}

source

Я понимаю, что этот синтаксис чем-то похож на infer.Я видел это здесь и там, но я все еще не совсем понимаю структуру и не мог найти информацию об этом.

1 Ответ

0 голосов
/ 28 января 2019

Тип T[K] представляет собой тип поиска , что означает T[K] - это тип значения свойства T в ключе K.(Обратите внимание, что T[K] не является T[].) Если T имеет цифровую подпись (например, массив), тогда T[number] - это тип свойства, хранящийся в числовом индексе T.В частности, если T равно Array<X>, то T[number] равно X.(Это приводит к тому, что string[][number] выглядит так же, как string).Надеюсь, это поможет.Удачи!

...