如何迭代打字稿字符串文字?

时间:2020-04-01 01:25:10

标签: typescript

我具有此文字类型export type names = 'n1' | 'n2' | 'n3' | 'n4' | 'n5' | 'n6';

我想知道您将如何迭代该类型?

也许您可以将该类型转换为其他类型并进行迭代?

您是否应该以其他方式重新定义类型?

names.forEach(value => {
  console.log(value);
}); 

2 个答案:

答案 0 :(得分:4)

简短回答

您可以将其定义为const和如下类型:

const names = ['n1' , 'n2' , 'n3' , 'n4' , 'n5' , 'n6'] as const;

// This produces the union type 'n1' | 'n2' | 'n3' | 'n4' | 'n5' | 'n6';
type names = typeof names[number];

// use names as a type here
const n1: names = 'n1';

console.log({
  names,
  n1,
  // use names as an array here
  mapped: names.map(name => `I am ${name}`)
});

说明和演示

这是怎么回事?

as const创建一个带有const context的数组。这意味着该数组不是string数组,而是特定字符串文字值的只读数组。

然后,typeof names[number]使用indexed access operator将这些字符串文字值提取为并集类型。

如果我们不使用as const定义数组,那么typeof names[number]会给我们string类型,而不是数组字符串文字值的并集。

最终结果非常简洁。我们可以将names用作类型检查的联合类型,并在运行时用作数组。

在这里is in the playground,这是JavaScript中的Playground输出:

"use strict";
const names = ['n1', 'n2', 'n3', 'n4', 'n5', 'n6'];
const n1 = 'n1';
console.log({
names,
n1,
mapped: names.map(name => `I am ${name}`)
});

注意事项:将names用作联合类型和数组值会引起有关命名约定的问题。通常,类型是PascalCased(例如Names),而值是camelCased(例如names)。在这里应该遵循哪些命名约定?

为完整起见,这是它在VS Code中跨两个文件的外观:

enter image description here

答案 1 :(得分:3)

已编译的代码中不存在类型-不会发出要迭代的任何内容。

如果您需要问题中所示的联合类型,并且需要能够将其作为数组进行迭代,请首先创建数组as const,然后将类型定义为数组的值:

const arr = ['n1', 'n2', 'n3', 'n4', 'n5', 'n6'] as const;
export type names = typeof arr[number];
for (const num of arr) {
  console.log(num);
}