Получение подмножества типа объединения на основе значений массива

#typescript #typescript-generics

#typescript #typescript-generics

Вопрос:

Учитывая следующие типы:

 // All possible values
type Alphabet = 'a' | 'b' | 'c' | 'd' | 'e' // ... etc

// Value transformation
type ComputedAlphabet<A extends Alphabet> = {[k in A]: true}

let x: ComputedAlphabet<'a' | 'b'>; // it correctly expects: {a: true, b: true}
 

Я хотел бы иметь тип функции, который принимает массив алфавита и вычисляет их значения:

 type TransformAlphabet=(chars: Alphabet[]) => ComputedAlphabet<how to get subset of Alphabet based on `chars`???>
 

В идеале я хотел бы написать подобный вызов и правильно определить тип:

 let transform: TransformAlphabet
transform(['a']) // should infer {a: true} as a return type
 

Конечно, первое, что я попробовал, это использовать общие типы, но не знал, как сделать общий тип необязательным при создании правильных типов:

 type TransformAlphabet<A extends Alphabet>=(chars: A[]) => ComputedAlphabet<A>
 

Это работает, если я вручную передаю A общий тип при вызове, что в моем случае непрактично.

Ответ №1:

У вас почти получилось:

 type TransformAlphabet=<A extends Alphabet>(chars: A[]) => ComputedAlphabet<A>
 

Игровая площадка TS

Комментарии:

1. Я добавил ссылку.