Get specific enum member from int in Typescript
这里有一个特定的例子,我有一个react按钮,它有一个枚举定义的类,该按钮通过switch语句选择正确的类,测试枚举的每个成员。这是硬编码的,这个组件工作正常(代码如下)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | import * as React from 'react'; import './SquareButton.css'; export interface Props { buttonType: ButtonType; style?: object; } const SquareButton = ({ buttonType, style }: Props) => { var className =""; switch (buttonType) { case ButtonType.Hamburger: className ="zmdi zmdi-menu zmdi-hc-2x"; break; case ButtonType.Clock: className ="zmdi zmdi-time zmdi-hc-2x"; break; case ButtonType.Wifi: className ="zmdi zmdi-network-wifi zmdi-hc-2x"; break; default: break; } return ( <i className={className} /> ) } export enum ButtonType { Wifi, Hamburger, Clock } export default SquareButton; |
我现在面临的问题是测试这个组件,因为这个EDOCX1[0]列表可能会增加,我希望能够循环通过每个按钮类型,而不必编写单独的测试,也不必在每次有新的按钮时添加新的测试。下面的示例测试。
1 2 3 4 5 6 | for (var i = 0; i < Object.keys(ButtonType).length / 2; i++) { test(ButtonType[i] + 'square button icon class must contain zmdi', () => { const button = Enzyme.shallow(<SquareButton buttonType={i as ButtonType} />) expect(button.find('div').find('i').hasClass("zmdi")).toEqual(true); }); } |
这成功地循环了枚举中的每个成员,但我不知道如何让循环中的特定枚举实例传递给组件。传递
如何从整数值中获取特定的枚举成员?
在这种情况下,
遍历枚举的问题是,枚举值不一定是数字,而且不需要有一半的枚举键是数字索引。
1 2 3 4 5 | enum A { B, C, D = 'D' } |
结果如下:
1 | ["0","1","B","C","D"] |
一种防故障的方法是:
1 2 3 4 5 6 7 8 | for (const enumKey of Object.keys(ButtonType).filter(key => isNaN(+key))) { const enumVal = ButtonType[enumKey] as ButtonType; test(`ButtonType.${enumKey} square button icon class must contain zmdi`, () => { const button = Enzyme.shallow(<SquareButton buttonType={enumVal} />) ... }) } |
由于最好也测试特定于