Ограничение типа jsdoc / typescript членом массива - PullRequest
0 голосов
/ 28 апреля 2020

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

Я знаю, что могу сделать это следующим образом :

/** @type {'one'|'two'|'three'} */
let v = 'four';
// ==> Error, type 'four' is not assignable to type 'one'|'two'|'three'

В моем случае у меня есть нужные значения рядом в массиве. Чтобы не перепечатывать, я бы хотел как-то ссылаться на них, но я не знаю, возможно ли это. Я хотел бы что-то вроде этого:

const OPTIONS = ['one', 'two', 'three'];

/** @type {string<Options>} */
let v = 'four';
// ==> Desired -- Error, type 'four' is not assignable to type 'one'|'two'|'three'
// ==> but that doesn't actually work...

Есть ли способ сделать это?

1 Ответ

0 голосов
/ 28 апреля 2020

Я не думаю, что вы можете достичь этого с помощью массива, поскольку они изменчивы во время выполнения:

const OPTIONS = ['one', 'two', 'three'];
OPTIONS[0] = 'BOOM';

Однако вы можете изменить массив на кортеж (кортежи являются неизменяемыми):

const OPTIONS = ['one', 'two', 'three'];                
const OPTIONS_TUPLE = ['one', 'two', 'three'] as const;

Сравнить предполагаемые типы:

// const OPTIONS: string[]
// const OPTIONS_TUPLE: readonly ["one", "two", "three"]

Теперь вы можете получить нужный тип:

const OPTIONS_TUPLE = ['one', 'two', 'three'] as const;
type OptionsValue = typeof OPTIONS_TUPLE[number];
const x: OptionsValue = 'four'; 
//TS2322: Type '"four"' is not assignable to type '"one" | "two" | "three"'.
...