Typescript枚举类型

问题1:如下写法为何不报错呢?我理解变量 a 的值应该是 1 ~ 7?

enum Weekday {
  Monday = 1,
  Tuesday,
  Wednesday,
  Thursday,
  Friday,
  Saturday,
  Sunday,
}
//不报错
const a: Weekday = 100;

问题2:如下写法为何会报错呢?

enum Direction {
  Up = 'UP',
  Down = 'DOWN',
  Left = 'LEFT',
  Right = 'RIGHT',
}
//error:不能将类型“"DOWN"”分配给类型“Direction”
const b: Direction = 'DOWN';

问题3:那如何实现上面的这种需求呢?

阅读 2.5k
3 个回答

这个问题上周研究了半天,大佬们回答的 断言Direction.DOWN 取代 'DOWN' 也可以临时规避此问题。

此类问题在typescript github上有很多issue反馈,似乎是ts设计问题。

#32690中,提问者给出一种解决方法:

namespace MyEnum {
  export const Zero = 0;
  export type Zero = typeof Zero;

  export const One = 1;
  export type One = typeof One;
}
type MyEnum = typeof MyEnum[keyof typeof MyEnum];
const foo: MyEnum.Zero = 0 // okay as expected
const bar: MyEnum.Zero = 1 // error as expected

其它相关issues:#31834#30629#26362#22464#22311

- const a: Weekday = 100;
+ const a = 100 as Weekday;

- const b: Direction = 'DOWN';
+ const b = 'DOWN' as Direction;

我再补充一下,如果你想校验有效性可以这样:

if (a in Weekday) {}

if (b === Direction.Down) {}

你为啥不写的规范一点呢


const b: Direction =Direction.DOWN ;
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题