我在typescript中定义了一个自定义文字类型:
export type Market = 'au'|'br'|'de';
Run Code Online (Sandbox Code Playgroud)
现在我想迭代每个可能Market而不必首先创建一个数组,Market[]因为它感觉多余,我可能忘记添加一个选项:
const markets: Market[] = ['au', 'br', 'de'];
markets.forEach((market: Market) => {
console.log(market);
});
Run Code Online (Sandbox Code Playgroud)
有没有办法用打字稿来达到这个目的?
kei*_*rth 35
对于那些使用 TypeScript >= 3.4 访问这个问题的人,我相信现在最好的做法是创建一个常量字符串数组,然后使用运算符的类型。
例子:
export const markets = ['au', 'br', 'de'] as const;
export type Market = typeof markets[number];
markets.forEach((market: Market) => {
console.log(market);
});
Run Code Online (Sandbox Code Playgroud)
不,您不能这样做,因为在运行时不存在类似的纯类型信息。
假设以另一种方式(定义一个正常的字符串列表,然后从中导出'au'|'br'|'de'类型)是可行的,但是我认为TypeScript编译器(2.0或2.1)目前不会为您推断这一点。我知道市场类型永远都是string[]正常的。
正确的答案是使用枚举。他们使用每个值定义一个类型,并且有可能获得所有字符串值的列表:如何在Typescript 0.9.5中以编程方式枚举枚举类型?。
枚举的一个缺点是它们的运行时表示形式是不同的(实际上,它们实际上是数字,而不是字符串)。尽管您的代码仍然可以将它们视为可读的值,但是如果您在运行时需要将它们用作字符串名称,则只需要将它们转换为字符串即可。不过,这很容易:给定enum MarketEnum和一个value myEnumValue,MarketEnum[myEnumValue]它是值的名称(字符串形式)。
我认为最容易理解的 TypeScript 3.9 完整示例:
enum SupportedLangugesEnum {
'au' = 'au',
'br' = 'br',
'de' = 'de',
}
for (let entry in SupportedLangugesEnum) {
if (isNaN(Number(entry))) {
console.log(entry);
}
}
for (let entry of Object.keys(SupportedLangugesEnum)) {
console.log(entry);
}
for (let entry of Object.values(SupportedLangugesEnum)) {
console.log(entry);
}
Run Code Online (Sandbox Code Playgroud)
将打印:
来源:
| 归档时间: |
|
| 查看次数: |
8622 次 |
| 最近记录: |