【问题标题】:Typescript enum static checking打字稿枚举静态检查
【发布时间】:2021-07-09 16:49:12
【问题描述】:

我仍然不确定如何理解 typescript 枚举。

考虑一下:

enum Int { a, b };
const array: Int[] = [];
array.push(Int.a); // ok
array.push(0); // same
array.push(1); // this is b
array.push(123); // works
array.push(-3e6); // also works

所以任何number 都与Int 兼容??

我知道我可以动态检查,因为 enum 声明也会生成一个对象声明,除非我们使用 const enum。但我预计静态类型为0 | 1 而不是number

现在是字符串枚举:

enum Str { a = 'a', b = 'b' };
const array: Str[] = [];
array.push(Str.a); // ok
array.push('a'); // fails

所以从前面的例子来看,人们可能认为Str 将与string 兼容,但不是。它与"a" | "b" 的事件不兼容。

有人能帮我理解吗?

具体来说,我正在研究为什么事情会这样工作的一些见解,有没有办法让编译器为我们检查事情?

【问题讨论】:

  • 只是为了好玩-使用type IntKeys = keyof Int; type NumberKeys = keyof number; 表明数字枚举键确实是数字,这些类型是相同的;)

标签: typescript enums


【解决方案1】:

我在typescript discord 询问过,显然,enums 已正式弃用。枚举已经在语言之前引入了联合类型和我们今天拥有的许多其他功能。

仅用于类型检查,可以使用文字联合类型,例如:

type Int = 0 | 1;

type Str = 'a' | 'b';

如果您还需要运行时检查,您可以将运行时对象声明为const,然后使用typeof 来构建类型。这比枚举更灵活,因为您可以选择如何对运行时对象进行编码。

以数组为例:

const colors = ['red', 'green', 'blue'] as const;
type Color = typeof colors[number]; // 'red' | 'green' | 'blue'

或作为地图:

const colors = {
  red: '#ff0000',
  green: '#00ff00',
  blue: '#0000ff'
} as const;
type Color = keyof typeof colors; // 'red' | 'green' | 'blue';

或者做更复杂的事情,比如将键与普通 enum 无法实现的功能相关联。唯一的缺点是声明比枚举更冗长,但我认为更好的类型检查和对运行时编码的额外控制是值得的。

【讨论】:

    猜你喜欢
    • 2020-04-30
    • 2019-11-07
    • 2017-05-09
    • 1970-01-01
    • 2021-04-19
    • 2020-10-27
    • 1970-01-01
    • 2020-01-29
    • 2019-03-04
    相关资源
    最近更新 更多