关于typescript:获取字符串文字类型值的数组

Get array of string literal type values

我需要得到字符串文字所有可能值的完整列表。

1
2
type YesNo ="Yes" |"No";
let arrayOfYesNo : Array<string> = someMagicFunction(YesNo); //["Yes","No"]

有什么办法能做到这一点吗?


枚举可以帮助您:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
enum YesNo {
    YES,
    NO
}

interface EnumObject {
    [enumValue: number]: string;
}

function getEnumValues(e: EnumObject): string[] {
    return Object.keys(e).map((i) => e[i]);
}

getEnumValues(YesNo); // ['YES', 'NO']

type声明不创建任何可以在运行时使用的符号,它只在类型系统中创建别名。所以你不能用它作为函数参数。

如果需要为YesNo类型设置字符串值,可以使用技巧(因为枚举的字符串值还不属于ts):

1
2
3
4
5
6
const YesNoEnum = {
   Yes: 'Yes',
   No: 'No'
};

function thatAcceptsYesNoValue(vale: keyof typeof YesNoEnum): void {}

然后,您可以使用getEnumValues(YesNoEnum)获得YesNoEnum的可能值,即[是'、'否']。有点难看,但那是可行的。

老实说,我只使用这样的静态变量:

1
2
type YesNo = 'yes' | 'no';
const YES_NO_VALUES: YesNo[] = ['yes', 'no'];


TypeScript 2.4最终发布。在支持字符串枚举的情况下,我不再需要使用字符串文本,而且由于类型脚本枚举是编译为javascript的,所以我可以在运行时访问它们(与数字枚举的方法相同)。