我正在用纯 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/