使用并集类型的文本字符串的自定义TypeScript类型不等于字符串



我试着在网上进行研究,但没有找到任何解决问题的方法。然而,我已经醒了一段时间了,所以这可能是我没有找到它的原因

我有以下自定义类型的

export type gameDifficulty = 'easy' | 'normal' | 'hard' | 'extreme';

我在课堂上使用的游戏

export class Game {
gameDifficulties: gameDifficulty[]
}

我有一个(类中的(对象,难度与相同

export class Card {
difficulty: gameDifficulty;
}

但是,每当我试图循环我的卡数组并检查gameDifferences是否具有其数组中卡的难度时,它就永远不会等于true(下面是调试中的示例(

cards.forEach(c => { // c.difficulty = 'easy' || c.difficulty = 'hard'
if (gameDifficulties.includes(c.difficulty)) { // gameDifficulties = ['easy', 'hard']
console.log(true) // I never enter here
} else {
console.log("Why am I false?")
}
});

我尝试了什么

各种测试用例,玩以下东西:

我在运行时用typeof()检查了类型,并且都输出了string

例如,我尝试了一个测试用例,其中比较了Card.difficultyeasy,但它也输出为false。

(我甚至尝试使用==而不是===,看看它是否仍然与类型有关,但没有解决任何问题(。

什么有效

我让它工作的唯一方法是使用.startsWith(),但这显然不能解决问题,也不能让我理解出了什么问题。

我发现了其他东西

https://www.screencast.com/t/plV0hTc5OJ

放置.startsWith()的顺序很重要,尽管两者的值相同(如上面链接的图像所示(。

编辑:在下面添加调试会话(0:29(以澄清问题

我录制了调试会话(0:29(,这样您就可以看到哪里出了问题。调试会话

编辑2:添加打字脚本版本

"typescript": "~3.9.7"

下面是一个使用字符串文字-的示例代码

type gameDifficulty = 'easy' | 'normal' | 'hard' | 'extreme';
class Game {
gameDifficulties: gameDifficulty[] = [];
}
class Card {
difficulty: gameDifficulty = "easy";
}
const cards = Array<Card>();
cards.push({ difficulty: "easy" });
cards.push({ difficulty: "extreme" });
let g = new Game();
g.gameDifficulties = ["easy", "hard"];
cards.forEach((c) => {
if (g.gameDifficulties.includes(c.difficulty)) {
// gameDifficulties = ['easy', 'hard']
console.log(c);
console.log(true); 
} else {
console.log(c);
console.log(false); 
}
});

试试这个片段打字游戏

您可以使用枚举来代替导出接口(有关枚举的详细信息,请点击此处(。我认为它更适合你的需要。

编辑

可以将枚举与字符串值一起使用(请参阅字符串枚举(

enum GameDifficulty {
easy = 'easy', normal = 'normal', hard = 'hard', extreme = 'extreme'
}
const gameDifficulties: GameDifficulty[] = [GameDifficulty.normal, GameDifficulty.hard];
const cards = [{difficulty:GameDifficulty.easy}, {difficulty:GameDifficulty.hard}];
cards.forEach(c => {
if (gameDifficulties.includes(c.difficulty)) {
console.log("found difficulty", c.difficulty);
} else {
console.log("difficulty not found?", c.difficulty)
}
});

以下是CodePen 中的相同示例

原始

枚举,将转换为int(请参阅数值枚举(

enum GameDifficulty { // Common practice to make first letter to capitalLetter in enum.
'easy', 'normal', 'hard', 'extreme'
}
const gameDifficulties: GameDifficulty[] = [GameDifficulty.normal, GameDifficulty.hard];
const cards = [{difficulty:GameDifficulty.easy}, {difficulty:GameDifficulty.hard}];
cards.forEach(c => {
if (gameDifficulties.includes(c.difficulty)) {
console.log("found difficulty", GameDifficulty[c.difficulty]);
} else {
console.log("difficulty not found?", GameDifficulty[c.difficulty])
}
});

最新更新