如何基于打字稿中的变量设置动态类型

时间:2019-05-23 16:14:02

标签: typescript

如果我输入的类型如下:

type Colors = "blue" | "red" | "green"

这意味着如果变量属于该类型,则只能是这三个字符串之一,而不仅仅是任何字符串...但是我将如何基于我定义的数组设置该类型呢?例如...

const DEFAULT_COLORS = ["orange", "yellow", "purple"];

type Colors = typeof DEFAULT_COLORS[number];

但是,这只是说“颜色类型的变量可以是数组中任何位置的类型...都是字符串,因此可以是字符串。”

我希望它根据变量将类型动态设置为常量

1 个答案:

答案 0 :(得分:0)

如果您使用的是TS 3.4+,则可以使用const断言来防止类型扩展。

/* This type alias converts Array<U> => U */
type ArrayType<T extends any[]> = T extends Array<infer U> ? U : never;

const colors = ["red", "blue", "green"] as const;
// typeof colors = ("red"|"blue"|"green")[]

type Color = ArrayType<typeof colors> // "red" | "blue" | "green"

如果您使用的是较早版本的打字稿,则可以使用以下内容:


/* This function prevents type widening to "string" */
function typedArray<T extends string>(...args: T[]): T[] {
  return args;
}

const colors = typedArray("red","blue","green");
// typeof colors = ("red"|"blue"|"green")[]

尽管我同意Jared Smith的评论,但枚举可能是最简单的解决方案

enum Color {
  RED,
  BLUE,
  GREEN
}

function doSomethingColorful(c: Color) {...}
// invoked like
doSomethingColorful(color.RED);