elementof?我可以做到这一点吗?

时间:2018-06-05 16:21:17

标签: typescript

这是我想要完成的事情:

const names = ["foo", "bar", "baz"];
type NameType = elementof names;  // this is not valid typescript

行为与此相同。

type NameType = "foo" | "bar" | "baz";

解决方案需要完成一些事情。

  • 提供有序的可枚举字符串序列。
  • 将名称公开为字符串文字类型的可寻址并集。
  • 允许字符串维护而无需冗余的源代码编辑。

打字稿可以这样做吗?

注意:这与Convert string[] literal to string type literal不同,因为该问题并不需要特定排序的字符串序列。联盟类型不会产生任何在运行时获取订单信息的方式。

1 个答案:

答案 0 :(得分:2)

您可以使用类型查询获取项目类型:

type NameType = typeof names[number]; 

问题是names的类型是string[]所以上面的代码只生成string

您可以使用辅助函数推断const的字符串文字类型。

function array<T extends string>(p: T[]) : T[] {
  return p
}

const names = array(["foo", "bar", "baz"]);
type NameType = typeof names[number];   // same as "foo" | "bar" | "baz"