如何迭代打字稿中的自定义文字类型?

时间:2016-11-29 10:28:02

标签: typescript types

我在typescript中定义了一个自定义文字类型:

export type Market = 'au'|'br'|'de';

现在我想迭代每个可能的Market,而不必首先创建一个Market[]数组,因为它感觉多余,我可能忘记添加一个选项:

const markets: Market[] = ['au', 'br', 'de'];
markets.forEach((market: Market) => {
    console.log(market);
});

有没有办法用打字稿来实现呢?

5 个答案:

答案 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和值myEnumValueMarketEnum[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);
}

将打印:

enter image description here

来源:

https://stackoverflow.com/a/39372911/3850405