typescript - 枚举作为构造函数中的参数会出错

标签 typescript enums constructor

我正在用纯 TypeScript 制作 Black Jack 应用程序,但是在卡片组内创建卡片时出现错误。到目前为止,我有 2 个类和 2 个枚举可以使用。

export enum Color {
  Hearts = 0,
  Spades,
  Diamonds,
  Clubs,
  Count,
  Hidden,
}

export enum Value {
  Two = 0,
  Three,
  Four,
  Five,
  Six,
  Seven,
  Eight,
  Nine,
  Ten,
  Knight,
  Queen,
  King,
  Ace,
  Count,
  Hidden,
}

export class Card {
  private color: Color;
  private value: Value;
  private isHidden: Boolean;

  constructor(color: Color, value: Value) {
    this.color = color;
    this.value = value;
    this.isHidden = true;
  }
}
import { Card, Color, Value } from './Card';

export default class Deck {
  private cards: Array<Card> = [];

  public Deck = (): void => {
    for (let colorIx = 0; colorIx < Color.Count; colorIx++) {
      for (let valueIx = 0; valueIx < Value.Count; valueIx++) {
        let c = new Card(Color[colorIx], Value[valueIx]);
        this.AddCard(c);
      }
    }
  };

  public AddCard = (card: Card): void => {
    this.cards.push(card);
  };
}
这部分是出现问题的地方。
let c = new Card(Color[colorIx], Value[valueIx]);
它,给了我一个错误说:

Argument of type 'string' is not assignable to parameter of type 'Color'.


但奇怪的是 Value 枚举根本没有给我一个错误,据我所知,它们的构造几乎相同。
有谁知道发生了什么?
为什么在构造函数中接受一个枚举(值)而另一个(颜色)不接受?

最佳答案

TypeScript 枚举有点不直观;查看您的代码 compiles to 可能会有所帮助看看为什么它会抛出它的错误。
服用 Color例如:TS 编译 Color到一个大致相当于:

const Color = {
  [0]: "Hearts",
  [1]: "Spades",
  [2]: "Diamonds",
  // ...
  Hearts: 0,
  Spades: 1,
  Diamonds: 2,
  // ...
}
所以当你这样做时 Color[0] , 你实际上得到的是文字字符串 "Hearts" ,这不是您想要的。从 number 转换对于相应的数字枚举,您实际上只需要使用 as 进行类型转换:
for (let colorIx = 0; colorIx < Color.Count; colorIx++) {
  for (let valueIx = 0; valueIx < Value.Count; valueIx++) {
    let c = new Card(colorIx as Color, valueIx as Value);
    this.AddCard(c);
  }
}
在引擎盖下,Color.Hearts被编译为只是 0 ,所以可以转换 0 as Color .
如果您想阅读更多,here are几个 SO 线程进一步讨论。

关于typescript - 枚举作为构造函数中的参数会出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66906856/

相关文章:

c++ - 初始化列表不检测公开继承的成员

typescript - 有没有办法从不同长度的元组的联合中提取带有类型的最后一个元素?

typescript - 从已解析的 Promise 返回 json 对象并在加载后分配它

javascript - 如何从组件更改服务变量的值?

c++ - Visual Studio C++ 枚举需要很长时间才能编译

Laravel 8 迁移 - 更改枚举值

javascript - 如何在 Angular2 中为 @Input 设置默认参数?

mysql - 如何在 MySql 中选择 ENUM 类型的值数?

java - 如何避免 GeneratedSerializationConstructorAccessor 问题?

c++ - 构造函数中的构造函数中的绑定(bind)