在 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
Run Code Online (Sandbox Code Playgroud)
如果我使用 atype而不是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'
Run Code Online (Sandbox Code Playgroud)
小智 1
您可能对 TS 中的枚举期望过高...:)
\n\nenum MyCoolEnum {\n A = 1,\n B = 2,\n}\n\nfunction test(data: MyCoolEnum) {\n console.log(`Test = ${typeof data}`)\n}\n\ntest(1)\ntest(MyCoolEnum.A)\ntest(500)\nRun Code Online (Sandbox Code Playgroud)\n\n如果您运行上面的代码,您将看到所有行都打印出来number,这意味着它在幕后被转换为数字,这就是它接受所有内容的原因......枚举通常只是避免幻数并使代码更具可读性
另一方面,如果您停止使用数字枚举并实际将 A 和 B 的值更改为字符串,您将得到:
\n\nTSError: \xe2\xa8\xaf Unable to compile TypeScript:\ndima.ts:10:6 - error TS2345: Argument of type '1' is not assignable to parameter of type 'MyCoolEnum'.\n\n10 test(1)\n ~\ndima.ts:12:6 - error TS2345: Argument of type '500' is not assignable to parameter of type 'MyCoolEnum'.\n\n12 test(500)\n ~~~\n\n at createTSError (/Users/odinn/.nvm/versions/node/v10.15.1/lib/node_modules/ts-node/src/index.ts:423:12)\n at reportTSError (/Users/odinn/.nvm/versions/node/v10.15.1/lib/node_modules/ts-node/src/index.ts:427:19)\n at getOutput (/Users/odinn/.nvm/versions/node/v10.15.1/lib/node_modules/ts-node/src/index.ts:554:36)\n at Object.compile (/Users/odinn/.nvm/versions/node/v10.15.1/lib/node_modules/ts-node/src/index.ts:760:32)\n at Module.m._compile (/Users/odinn/.nvm/versions/node/v10.15.1/lib/node_modules/ts-node/src/index.ts:839:43)\n at Module._extensions..js (internal/modules/cjs/loader.js:700:10)\n 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)\n at Module.load (internal/modules/cjs/loader.js:599:32)\n at tryModuleLoad (internal/modules/cjs/loader.js:538:12)\n at Function.Module._load (internal/modules/cjs/loader.js:530:3)\nRun Code Online (Sandbox Code Playgroud)\n\n所以我想说的是,如果它是一个数字枚举,它只是化妆品,它被视为一个数字,但如果你创建一个字符串枚举,那么它实际上会尝试匹配类型
\n| 归档时间: |
|
| 查看次数: |
2164 次 |
| 最近记录: |