我试图实现的是声明类型的数组。
使用枚举,我可以这样实现:
export enum Day {
SU = 'su',
MO = 'mo',
TU = 'tu',
WE = 'we',
TH = 'th',
FR = 'fr',
SA = 'sa',
}
getDays(): String[] {
return Object.values(Day);
}
输出将为['su', 'mo' etc. ]
我想从这一方法中获得类似的结果:
export declare type WeekDays = 'su' | 'mo' | 'tu' | 'we' | 'th' | 'fr' | 'sa';
输出与['su', 'mo' etc. ]
有什么想法吗?
我尝试了Object.entries()
和Object.getOwnPropertyNames()
。不幸的是,它不起作用。
答案 0 :(得分:2)
WeekDays
只是一个类型,类型没有任何运行时状态,因此我们无法访问该类型在运行时保存的任何信息。枚举在运行时表示为对象,这就是为什么我们可以从它们中提取信息。有关类型与值的讨论,请参见更多here。
禁止自定义编译器转换(这意味着用发出更多信息的自定义版本替换常规编译器),我们唯一能做的就是构造一个函数以检索值,这要求我们传入包含以下内容的对象文字完全枚举中的字符串。尽管这要求我们重新声明字符串,但是编译器将检查是否不添加任何多余的字符串,并且也没有丢失的字符串,因此这可能就足够了:
export declare type WeekDays = 'su' | 'mo' | 'tu' | 'we' | 'th' | 'fr' | 'sa';
function getValues<T extends string>(values: { [P in T]: P }) : T[]{
return Object.values(values);
}
// Ok values are all stated, the values are correctly stated.
getValues<WeekDays>({fr: 'fr',mo: 'mo',sa:'sa',su:'su',th:'th',tu:'tu',we:'we'})
// Error values don't match
getValues<WeekDays>({fr: 'frrr',mo: 'mo',sa:'sa',su:'su',th:'th',tu:'tu',we:'we'})
// Error values missing
getValues<WeekDays>({mo: 'mo',sa:'sa',su:'su',th:'th',tu:'tu',we:'we'})
// Error values extra values
getValues<WeekDays>({funDay: 'funDay', fr: 'fr', mo: 'mo',sa:'sa',su:'su',th:'th',tu:'tu',we:'we'})
答案 1 :(得分:1)
typescrpt中的所有类型仅是元数据,并且在运行时不可用。因此,无法检索字符串文字类型中的有效字符串列表。