如何在typescript中迭代字符串文字类型

时间:2017-03-28 10:39:30

标签: typescript enums

如何在typescript中迭代字符串文字类型?

例如我定义了这种类型

type Name = "Bill Gates" | "Steve Jobs" | "Linus Torvalds";

我想像这样迭代

for (let name of Name) {
    console.log("Possible name: " + name);
}

或者这在打字稿中根本不可能吗?

5 个答案:

答案 0 :(得分:3)

由于TypeScript只是一个编译器,因此运行时不会出现任何类型信息。这意味着,遗憾的是,您无法遍历某个类型。

根据您尝试执行的操作,您可以使用枚举来存储您可以在数组中检索的名称索引。

答案 1 :(得分:3)

由于打字稿2.4,可以使用字符串类型的枚举。这些枚举可以很容易地重复:

https://blogs.msdn.microsoft.com/typescript/2017/06/27/announcing-typescript-2-4/

答案 2 :(得分:2)

AFAIK没有办法提升"字符串union(类型)到运行时JS(值)。

我找到的最接近的解决方案是使用enumexample / related issue

答案 3 :(得分:0)

您可以定义数组文字,而不是按照请求的OP迭代字符串文字类型(的联合),并且如果标记为as const,则条目的类型将是字符串文字类型的并集。

自打字稿3.4起,您可以在文字表达式上定义const断言以标记以下内容:  -该表达式中的文字类型均不应扩展(例如,不要从“ hello”到字符串)  -数组文字变成只读元组

例如:

const names = ["Bill Gates" | "Steve Jobs" | "Linus Torvalds"] as const;

它可以在运行时使用并检查类型,例如:

const companies = {
    "Bill Gates" : "Microsoft",
    "Steve Jobs" : "Apple",
    "Linus Torvalds" : "Linux",
} as const;

for(const n of names) {
    console.log(n, companies[n]);
}

https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-4.html#const-assertions

https://mariusschulz.com/blog/const-assertions-in-literal-expressions-in-typescript

答案 4 :(得分:0)

您不能使用联合类型。但是你可以用枚举来做到这一点:

enum Name {
  'Bill Gates' = 'Bill Gates',
  'Steve Jobs' = 'Steve Jobs',
  'Linus Torvalds' = 'Linus Torvalds'
}

for (const name of Object.keys(Name)) {
  console.log('Possible name: ' + name)
}