Преобразовать массив строк в тип TypeScript - PullRequest
0 голосов
/ 04 сентября 2018

Скажем, у меня есть массив строк:

const s = ['foo', 'rolo', 'zoombaz'];

и я бы получил:

type v = {
   foo: string,
   rolo: string,  
   zoombaz: string
}

бонус: в идеале я хочу сопоставить их с верблюжьим чехлом, так что если бы у меня было:

const s = ['foo', 'rolo', 'zoom-baz'];

Я бы получил:

type v = {
   foo: string,
   rolo: string,  
   zoomBaz: string
}

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

1 Ответ

0 голосов
/ 05 сентября 2018

Сначала вам нужно получить TypeScript для вывода типа элемента массива в виде объединения строковых литеральных типов вместо расширения до string. Стандартный трюк, поддерживаемый компилятором, заключается в том, чтобы запустить массив через функцию идентификации, которая выводит тип элемента, ограниченный string:

function asLiterals<T extends string>(arr: T[]): T[] { return arr; }
const s = asLiterals(['foo', 'rolo', 'zoombaz']);

Теперь вы можете определить:

type v = {[K in (typeof s)[number]]: string};

TypeScript не будет выполнять какие-либо манипуляции со строками, такие как верблюд в системе типов. Тем не менее, вы могли изначально определить имена в корпусе, который вы хотите для типов, а затем преобразовать в любой другой корпус во время выполнения.

...