枚举TypeScript字符串文字

时间:2017-01-19 18:33:10

标签: typescript

有没有办法循环TypeScript字符串文字的值?

type category = "foo" | "bar" | "baz" | "xyzzy"

for (c in category) {
    // ... do something with each category
}

我目前有这样的事情:

let cat: category = ...

switch (cat) {
    case "foo":
    default:
        process("foo")
        break

    case "bar":
        process("bar")
        break

    case "baz":
        process("baz")
        break

    case "xyzzy":
        process("xyzzy")
        break
}

但我宁愿使用像

这样的东西
let others: category = []
for (c in category) {      // Iterate over possible category values
    if (c !== "foo") others.push(c)
}

if (others.indexOf(cat) >= 0) {
    process(cat)
} else {
    process("foo")
}

2 个答案:

答案 0 :(得分:13)

使用typescript 2.1和keyof type,可以反过来做 - 你可以使用必要的键定义一个对象,并使用keyof得到所有键的联合类型:

let categoryKeys = {foo: '', bar: '', baz: '', xyzzy: ''}; // values do not matter

type category = keyof typeof categoryKeys;

let x: category = 'foo'; // ok
let z: category = 'z'; //  error TS2322: Type '"z"' is not assignable 
                       // to type '"foo" | "bar" | "baz" | "xyzzy"'.

console.log(Object.keys(categoryKeys)); // prints [ 'foo', 'bar', 'baz', 'xyzzy' ]

答案 1 :(得分:4)

这是类型声明。

type category = "foo" | "bar" | "baz" | "xyzzy"

TypeScript转换为没有类型的JavaScript。 键入TypeScript只是关于可能的某些值(在这种情况下)的转换器的信息。并且类型声明不会编译到任何实际的运行时JavaScript对象中。 因此,您无法遍历它,但您可以在交换机构造中使用它。