在TypeScript中,我定义了一个枚举
,然后我想让一个函数接受一个参数,该参数的值是枚举的值之一。但是,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
如果我使用类型
而不是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'
您可能对TS中的枚举期望过高...:)
enum MyCoolEnum {
A = 1,
B = 2,
}
function test(data: MyCoolEnum) {
console.log(`Test = ${typeof data}`)
}
test(1)
test(MyCoolEnum.A)
test(500)
如果您运行上面的代码,您将看到所有行都打印number
,这意味着在幕后它被转换为一个数字,这就是为什么它接受所有...枚举通常只是一种避免神奇数字并使代码更具可读性的好做法
另一方面,如果您停止使用数值枚举,并实际将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)
所以我想说的是,如果它是一个数字枚举,它只是化妆品,它被视为一个数字,但如果你做一个字符串枚举,例如,那么它实际上试图匹配类型
我写了以下方法 我如何将不同的枚举类型传递给第二个参数?我知道我不能创建枚举的实例,但初始化枚举意味着我将传递一个值,而不是整个初始化的枚举,如下所示...其他枚举也将传递给相同的方法以实现组合细节
本文向大家介绍TypeScript 类型参数作为约束,包括了TypeScript 类型参数作为约束的使用技巧和注意事项,需要的朋友参考一下 示例 使用TypeScript 1.8,类型参数约束可以从同一类型参数列表中引用类型参数。以前这是一个错误。
我想用:调用它。但它不喜欢:
问题内容: 例如,我该怎么做: 结果示例: 问题答案: 迅捷4.2+ 从Swift 4.2(使用Xcode 10)开始,只需添加协议一致性即可从中受益。要添加此协议一致性,您只需要在某处写: 如果枚举是您自己的,则可以直接在声明中指定一致性: 然后,以下代码将打印所有可能的值: 与早期Swift版本(3.x和4.x)的兼容性 如果您需要支持Swift 3.x或4.0,则可以通过添加以下代码来模仿S
问题内容: 假设是,我将如何产生给定序数的枚举值? 问题答案: 足够了。一条线; 足够简单。