【发布时间】:2017-05-24 09:13:24
【问题描述】:
我需要获取字符串文字的所有可能值的完整列表。
type YesNo = "Yes" | "No";
let arrayOfYesNo : Array<string> = someMagicFunction(YesNo); //["Yes", "No"]
有什么方法可以实现吗?
【问题讨论】:
标签: typescript
我需要获取字符串文字的所有可能值的完整列表。
type YesNo = "Yes" | "No";
let arrayOfYesNo : Array<string> = someMagicFunction(YesNo); //["Yes", "No"]
有什么方法可以实现吗?
【问题讨论】:
标签: typescript
枚举在这里可以帮助你:
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 yet 的一部分):
const YesNoEnum = {
Yes: 'Yes',
No: 'No'
};
function thatAcceptsYesNoValue(vale: keyof typeof YesNoEnum): void {}
然后您可以使用getEnumValues(YesNoEnum) 来获取YesNoEnum 的可能值,即['Yes', 'No']。这有点难看,但可以。
说实话,我会使用这样的静态变量:
type YesNo = 'yes' | 'no';
const YES_NO_VALUES: YesNo[] = ['yes', 'no'];
【讨论】:
const YES_NO_VALUES: YesNo[] = [ 'yes', 'no', 'maybe'];
function getEnumValues(e: EnumObject): string[] { return Object.keys(e).map((_, idx: number): string => e[idx]); }
Typescript 2.4 是 finally released。在字符串枚举的支持下,我不再需要使用字符串文字,并且因为 typescript 枚举被编译为 javascript,我可以在运行时访问它们(与 number enums 相同的方法)。
【讨论】: