如何解决使用联合类型的文字字符串的自定义TypeScript类型不等于字符串
我尝试过在线研究,但是没有找到解决问题的办法。但是,我已经醒了一段时间,所以这可能是我找不到它的原因。
我具有以下自定义类型
export type gameDifficulty = 'easy' | 'normal' | 'hard' | 'extreme';
我在“游戏”课程中使用的是
export class Game {
gameDifficulties: gameDifficulty[]
}
我有一个难度相同的对象(类)
export class Card {
difficulty: gameDifficulty;
}
但是,每当我尝试循环我的Card数组并检查gameDifficulties是否在其数组中遇到了难点时,它就永远不等于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.difficulty
与easy
进行了比较,但它也输出为false。
(我什至尝试使用==
而不是===
来查看它是否仍然与类型有关,但没有解决任何问题。)
有效的方法
使它起作用的唯一方法是使用.startsWith()
,但这显然无法解决或使我无法理解问题所在。
我发现的其他情况
https://www.screencast.com/t/plV0hTc5OJ
您放置.startsWith()
的顺序很重要,尽管两者都是相同的值(如上面链接的图像所示)。
编辑:在下面添加了调试会话(0:29)以澄清问题
我记录了我的调试会话(0:29),因此您可以查看它出了什么问题。 Debugging session
编辑2:添加了打字稿版本
"typescript": "~3.9.7"
解决方法
您可以使用枚举(More information about enum here)代替导出接口。 我认为它更适合您的需求。
编辑
可以将enum与字符串值一起使用(请参见String enums)
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
中的示例原始
枚举,它将转换为整数(请参见Numeric enums)
enum GameDifficulty { // Common practice to make first letter to capitalLetter in enum.
'easy','normal','hard','extreme'
}
const gameDifficulties: GameDifficulty[] = [GameDifficulty.normal,GameDifficulty[c.difficulty]);
} else {
console.log("difficulty not found?",GameDifficulty[c.difficulty])
}
});
,
以下是使用字符串文字的示例代码-
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);
}
});
试用此代码段Typescript Playground
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。