вы можете ожидать слишком много от 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, это просто косметика, и она рассматривается как число, но если вы, например, создаете перечисление строк, то оно фактически пытается соответствовать типу