如何将联合类型的所有可能值获取到数组(或相反)?

men*_*fon 8 typescript

例子:

type X = 'a' | 'b';
const xVals = ??? X; // ['a', 'b']
Run Code Online (Sandbox Code Playgroud)

或者相反(从所有可能值的列表中获取一个类型,该类型是数组中所有值的并集)。

我的目标是将所有可能的值仅列出一次。

Tit*_*mir 7

您无法从类型转换为值。您可以采用另一种方式,从可以获取类型的值开始。问题是数组值['a', 'b']将被键入为string[]并且字符串文字类型的联合将丢失。

使用函数强制编译器推断指定值的字符串文字类型的解决方案:

function stringTuple<T extends [string] | string[]>(...data: T): T {
    return data;
}

let xValues = stringTuple('a', 'b') // typed as ["a", "b"]
type x = typeof xValues[number] // 'a' | 'b' 
Run Code Online (Sandbox Code Playgroud)


mjs*_*sen 5

stringTuple作为@Titian 答案中函数的替代解决方案,从 TypeScript 3.4 开始,您可以使用const断言

const xValues = ['a', 'b'] as const; // type: readonly ["a", "b"]
type X = typeof xValues[number]; // type: "a" | "b"
Run Code Online (Sandbox Code Playgroud)