Result будет объединением 'Field1' | 'Field2'. Mapped type оставляет имена полей, чьи типы совместимы со String, и заменяет остальные на never.
Вывод значения типа Result
Result будет объединением 'Field1' | 'Field2'. Mapped type оставляет имена полей, чьи типы совместимы со String, и заменяет остальные на never.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо определить, какое значение получит тип Result.
type ExampleType = {
Field1: string
Field2: string
Field3: number
Field4: boolean
}
type T1<S, T> = {
[K in keyof S]: S[K] extends T ? K : never
}[keyof S];
type Result = T1<ExampleType, String>
Ответ
Result будет объединением 'Field1' | 'Field2'. Mapped type оставляет имена полей, чьи типы совместимы со String, и заменяет остальные на never.
Промежуточный объект содержит Field1: 'Field1', Field2: 'Field2', а Field3 и Field4 имеют тип never. Индексирование через [keyof S] собирает значения в union; never из него исчезает. Примитивный string совместим с интерфейсом String, поэтому строковые поля проходят условие. Однако для обычных строк правильнее писать T1<ExampleType, string>: заглавный String обозначает объектную обёртку и редко нужен в прикладных аннотациях.
Источник: www.typescriptlang.org.