В общем, нет никакой разницы, keyof
- это просто тип объединения всех ключей (имен свойств и методов), которые существуют в аргументе keyof
.
Но начиная с TypeScript 3.1,Существует один особый случай - тот же синтаксис с keyof
используется для создания отображаемых типов для кортежей и массивов .
В TypeScript 3.1 сопоставленные типы объектов поверх кортежей и массивов теперь создают новые кортежи / массивы, а не создают новый тип, в который преобразуются такие элементы, как push (), pop () и length.
Итак, когда существует унифицированный (гомоморфный) отображенный тип
type ForwardVal<T> = {
[K in keyof T]: string;
};
и его аргумент T
является типом кортежа или массива (в вашем случае это ForwardVal<number[]>
)затем, как сказано в документации, «преобразуются только числовые свойства», в результате чего string[]
получается как результирующий тип.