Angular5中声明类型的数组 - 打字稿

Posted

技术标签:

【中文标题】Angular5中声明类型的数组 - 打字稿【英文标题】:Array from declare type in Angular5 - typescript 【发布时间】:2018-12-11 16:57:52 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

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')

【讨论】:

【参考方案2】:

typescrpt 中的所有类型都只是元数据,在运行时不可用。因此,无法检索字符串文字类型中的有效字符串列表。

【讨论】:

以上是关于Angular5中声明类型的数组 - 打字稿的主要内容,如果未能解决你的问题,请参考以下文章

如何在打字稿中声明函数类型

找不到打字稿类型声明

打字稿:使用类型声明强制进行空检查?

Angular5:将变量从一个组件传递到另一个打字稿文件

如何在打字稿中声明成功/失败返回类型

合并/检索打字稿声明文件