В чем разница между keyof внутри и снаружи индексатора? - PullRequest
0 голосов
/ 16 ноября 2018

Предположим, у нас есть следующий код TypeScript:

type ForwardVal<T> = { 
    [K in keyof T]: string; 
};
type ForwardKeyOf<T extends string | number | symbol> = { 
    [K in T]: string; 
};

type ByObj   = ForwardVal<number[]>;         // string[]
type ByKeyOf = ForwardKeyOf<keyof number[]>; // { length: string, toString: string, ... }

type foo =   ByObj['push'];   // (...items: string[]) => number
type bar = ByKeyOf['push'];   // string

Почему foo не строка, а bar?В чем разница между пересылкой keyof obj и наличием Key in T от пересылки obj самой и выполнением Key in keyof T внутри отображенного типа?Разве T параметр просто не заменен его данным значением?

1 Ответ

0 голосов
/ 16 ноября 2018

В общем, нет никакой разницы, keyof - это просто тип объединения всех ключей (имен свойств и методов), которые существуют в аргументе keyof.

Но начиная с TypeScript 3.1,Существует один особый случай - тот же синтаксис с keyof используется для создания отображаемых типов для кортежей и массивов .

В TypeScript 3.1 сопоставленные типы объектов поверх кортежей и массивов теперь создают новые кортежи / массивы, а не создают новый тип, в который преобразуются такие элементы, как push (), pop () и length.

Итак, когда существует унифицированный (гомоморфный) отображенный тип

type ForwardVal<T> = { 
    [K in keyof T]: string; 
};

и его аргумент T является типом кортежа или массива (в вашем случае это ForwardVal<number[]>)затем, как сказано в документации, «преобразуются только числовые свойства», в результате чего string[] получается как результирующий тип.

...