Перечисление Typescript как тип параметра допускает недопустимые значения - PullRequest
2 голосов
/ 22 апреля 2020

В TypeScript я определяю enum, затем я хочу, чтобы функция принимала параметр, значение которого является одним из значений перечисления. Тем не менее, TypeScript, похоже, не выполняет никакой проверки значения и допускает значения вне перечисления. Есть ли способ сделать это?

Пример

enum myenum {
    hello = 1,
    world = 2,
}

const myfunc = (num:myenum):void => console.log(`num=${num}`);

myfunc(1);            // num=1 (expected)
myfunc(myenum.hello); // num=1 (expected)

//THE ISSUE: I'm expecting next line to be a TS compile error, but it is not
myfunc(7); // num=7

Альтернатива

Если я использую type вместо enum, я могу получить что-то похожее на то, что Я ищу, но я теряю некоторые функциональные возможности enum.

type mytype = 1|2;
const myfunc = (num:mytype):void => console.log(`num=${num}`);

myfunc(1);
myfunc(7);  //TS Compile Error: Argument of type '7' is not assignable to a parameter of type 'mytype'

Обновление

Кажется, на данный момент это работает как задумано .

1 Ответ

1 голос
/ 22 апреля 2020

вы можете ожидать слишком много от enum в TS ...:)

enum MyCoolEnum {
  A = 1,
  B = 2,
}

function test(data: MyCoolEnum) {
  console.log(`Test = ${typeof data}`)
}

test(1)
test(MyCoolEnum.A)
test(500)

Если вы запустите этот код выше, вы увидите, что все строки выводят number, что означает, что за сцены это переводится в число, и поэтому он принимает все ... Перечисления, как правило, просто хорошая практика, чтобы избежать волшебные числа c и сделать код более читабельным

С другой стороны, если вы остановите используя нумерацию чисел c и фактически заменяя значения для A и B на строки, вы получите:

TSError: ⨯ Unable to compile TypeScript:
dima.ts:10:6 - error TS2345: Argument of type '1' is not assignable to parameter of type 'MyCoolEnum'.

10 test(1)
        ~
dima.ts:12:6 - error TS2345: Argument of type '500' is not assignable to parameter of type 'MyCoolEnum'.

12 test(500)
        ~~~

    at createTSError (/Users/odinn/.nvm/versions/node/v10.15.1/lib/node_modules/ts-node/src/index.ts:423:12)
    at reportTSError (/Users/odinn/.nvm/versions/node/v10.15.1/lib/node_modules/ts-node/src/index.ts:427:19)
    at getOutput (/Users/odinn/.nvm/versions/node/v10.15.1/lib/node_modules/ts-node/src/index.ts:554:36)
    at Object.compile (/Users/odinn/.nvm/versions/node/v10.15.1/lib/node_modules/ts-node/src/index.ts:760:32)
    at Module.m._compile (/Users/odinn/.nvm/versions/node/v10.15.1/lib/node_modules/ts-node/src/index.ts:839:43)
    at Module._extensions..js (internal/modules/cjs/loader.js:700:10)
    at Object.require.extensions.(anonymous function) [as .ts] (/Users/odinn/.nvm/versions/node/v10.15.1/lib/node_modules/ts-node/src/index.ts:842:12)
    at Module.load (internal/modules/cjs/loader.js:599:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
    at Function.Module._load (internal/modules/cjs/loader.js:530:3)

Итак, я пытаюсь сказать, что если это перечисление цифр c, это просто косметика, и она рассматривается как число, но если вы, например, создаете перечисление строк, то оно фактически пытается соответствовать типу

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...