Typescript проверка значения на соответствие типу(string literal type)

Когда хочется использовать литеральные типы(string literal types) вместо перечислений(enum), встает вопрос как проверить значение на соответствие типу в рантайме.

С версии Typescript 3.4 это сделать довольно просто.

1. Объявляем массив с типами:

const typeList = ['type1', 'type2', 'type3'] as const;

* as const запрет на изменение объекта

2. Делаем типы на основе массива

type MyType = typeof typeList[number];

синтаксис typeof typeList[number] обозначает, что типами будут все значения массива, можно сделать тип только из одного значения typeof typeList[1]

3. теперь мы можем спокойно делать проверку на соответствие типа, без лишних движений:

typeList.includes(myValue);