Angular5中的声明类型数组-Typescript

时间:2018-07-03 11:31:29

标签: typescript angular5

我试图实现的是声明类型的数组。

使用枚举,我可以这样实现:

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()。不幸的是,它不起作用。

2 个答案:

答案 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中的所有类型仅是元数据,并且在运行时不可用。因此,无法检索字符串文字类型中的有效字符串列表。