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

k0p*_*kus 14 types typescript

我在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)

  • @scale_tone - 不正确。市场类型不等于“字符串”。` const 市场 = ['au', 'br', 'de'] as const; 市场类型=市场类型[数字];const 测试:市场 = '测试';类型“test”不可分配给类型“br” | “au”| “德”。` (9认同)
  • 如果您忘记了“as const”子句,则类型将为“string”。刚刚发生在我身上...:/ (4认同)
  • 谢谢:-) `as const` 是什么意思? (3认同)
  • 它告诉 Typescript 它是不可变的。https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-4.html#const-assertions (3认同)

Tim*_*rry 6

不,您不能这样做,因为在运行时不存在类似的纯类型信息。

假设以另一种方式(定义一个正常的字符串列表,然后从中导出'au'|'br'|'de'类型)是可行的,但是我认为TypeScript编译器(2.0或2.1)目前不会为您推断这一点。我知道市场类型永远都是string[]正常的。

正确的答案是使用枚举。他们使用每个值定义一个类型,并且有可能获得所有字符串值的列表:如何在Typescript 0.9.5中以编程方式枚举枚举类型?

枚举的一个缺点是它们的运行时表示形式是不同的(实际上,它们实际上是数字,而不是字符串)。尽管您的代码仍然可以将它们视为可读的值,但是如果您在运行时需要将它们用作字符串名称,则只需要将它们转换为字符串即可。不过,这很容易:给定enum MarketEnum和一个value myEnumValueMarketEnum[myEnumValue]它是值的名称(字符串形式)。


Ogg*_*las 6

我认为最容易理解的 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)

将打印:

在此输入图像描述

来源:

/sf/answers/2756103801/