我在typescript中定义了一个自定义文字类型:
export type Market = 'au'|'br'|'de';
现在我想迭代每个可能的Market
,而不必首先创建一个Market[]
数组,因为它感觉多余,我可能忘记添加一个选项:
const markets: Market[] = ['au', 'br', 'de'];
markets.forEach((market: Market) => {
console.log(market);
});
有没有办法用打字稿来实现呢?
答案 0 :(得分:9)
对于那些使用TypeScript> = 3.4来访问此问题的人,我认为最佳实践是现在创建一个常量字符串数组,然后使用运算符的类型。
示例:
export const markets = ['au', 'br', 'de'] as const;
export type Market = typeof markets[number];
markets.forEach((market: Market) => {
console.log(market);
});
答案 1 :(得分:2)
不,你不能这样做,因为在运行时不存在这样的纯类型信息。
假设其他方式是合理的(定义一个正常的字符串列表,然后从中导出'au'|'br'|'de'
类型),但我不认为TypeScript编译器(或者2.0或2.1)目前将为您推断 - 据我所知,市场类型通常为string[]
。
正确的答案是使用枚举。他们使用每个值定义一个类型,并且可以获得所有字符串值的列表:How to programmatically enumerate an enum type in Typescript 0.9.5?。
枚举的一个缺点是它们的运行时表示是不同的(在引擎盖下它们实际上是数字,而不是字符串)。您的代码仍然可以将它们视为可读的值,但是如果您在运行时需要将它们作为字符串名称,那么您只需要将它们转换为字符串。这很容易:给定枚举MarketEnum
和值myEnumValue
,MarketEnum[myEnumValue]
是值的名称作为字符串)。
答案 2 :(得分:0)
这是我在创建一个包含运行时所有值的数组并在编译时检查的方法:
export type Market = 'eu' | 'us'
export const MARKET_TYPES: Market[] = (() => {
const markets: Market[] = ['eu', 'us']
return markets.map((x: Market) => {
if (x === 'eu') {
return x
} else if (x === 'us') {
return x
} else {
const _exhaustive_check: never = x
return _exhaustive_check
}
})
})()
答案 3 :(得分:0)
这是另一种方法:
enum Market {
'eu' = 'eu',
'us' = 'us',
}
const all_possible_market_values = getStringValuesFromEnum(Market)
function getStringValuesFromEnum<T>(myEnum: T): (keyof T)[] {
return Object.keys(myEnum) as any
}
基础表示不再是数字,而是字符串。
"use strict";
var Market;
(function (Market) {
Market["eu"] = "eu";
Market["us"] = "us";
})(Market || (Market = {}));
const all_possible_market_values = getStringValuesFromEnum(Market);
function getStringValuesFromEnum(myEnum) {
return Object.keys(myEnum);
}
答案 4 :(得分:0)
我认为最容易理解的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);
}
将打印:
来源: