получить String Literal Types из Object в runtime

181
04 мая 2018, 12:03

В проекте используются sass для стилизации и typescript для типизации.

Есть набор констант который используется и стилях и интерфейсах реактовских компонентов. Это цвета.

Сейчас есть отдельно файл colors.scss вида

$white: white;
$brightest: #f0f0f0
...

И энум

enum Colors {
    WHITE = 'white',
    BRIGHTEST = 'brightest',
    ...
}

Хочется избежать поддержки двух файлов. Можно ли как то в рантайме сгенерить тайпскриптовый тип?

Пробовал так

colors.scss

$white: white;
$brightest: #f0f0f0
:export {
  white: $white;
  brightest: $brightest;
}

somefile.ts

import colors from "colors.scss";
function literalArray<K extends string>(args: K[]): K[] {
   return args;
}
 const ProxyProperties = literalArray(Object.keys(colors)); // так не работает
 // const ProxyProperties = literalArray(['white', 'brightest']); // а так работает
type colorsType = typeof ProxyProperties[number];
((v: colorsType) => console.log(v))("white");
((v: colorsType) => console.log(v))("red");
((v: colorsType) => console.log(v))('');

При таком подходе тип генерится только если явно в функцию передать массив, если его получить через Object.keys то вместо

type colorsType = 'white' | 'brightest'

получаем

type colorsType = string
READ ALSO
Смена id объекта JS

Смена id объекта JS

Есть два объекта input

173
Обновление данных chart.js

Обновление данных chart.js

Есть функция рисования графика использующая chartjs

189
Мотоцикл viper f2 200 его карбюратор [требует правки]

Мотоцикл viper f2 200 его карбюратор [требует правки]

Подскажите самого низа шланг куда он идёт

230
Способ генерации HTML кода на PHP

Способ генерации HTML кода на PHP

Меня интересует, насколько правильно я генерирую динамику на сайтеДопустим, есть основной шаблон (статика) и для генерации контента используется...

248