【问题标题】:Enum as a parameter in a constructor gives an error枚举作为构造函数中的参数会出错
【发布时间】:2021-06-28 14:09:33
【问题描述】:

我正在使用纯 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]);

它,给我一个错误说:

“字符串”类型的参数不能分配给类型参数 “颜色”。

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

【问题讨论】:

    标签: typescript enums constructor


    【解决方案1】:

    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 线程进行进一步讨论。

    【讨论】:

    • 嘿,非常感谢。这解决了它。解释也很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 2018-10-30
    • 2014-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多