在Angular5 - typescript中声明类型的数组
在Angular5 - typescript中声明类型的数组
我想要实现的是从声明类型中获取数组。
使用枚举,我可以这样实现:
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'等]
我希望从以下方式实现类似的方式:
export declare type WeekDays = 'su' | 'mo' | 'tu' | 'we' | 'th' | 'fr' | 'sa';
并且希望得到类似的输出: ['su', 'mo'等]
有任何建议吗?
我尝试了Object.entries()
和Object.getOwnPropertyNames()
,但不幸的是它们不起作用。
在Angular5 - typescript中,出现了(Array from declare type in Angular5 - typescript)这个问题。问题的原因是WeekDays只是一个类型,类型在运行时没有任何存在,因此我们无法在运行时访问类型所持有的任何信息。而枚举在运行时表示为对象,这就是为什么我们可以从枚举中提取信息的原因。
解决这个问题的方法是构建一个函数来检索值,这需要我们传入一个包含枚举中所有字符串的对象字面量。虽然这需要我们重新声明字符串,但编译器将检查我们是否添加了额外的字符串或者是否缺少了字符串,因此这可能已经足够好了。
以下是解决方法的示例代码:
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'})
问题的原因:在TypeScript中,所有的类型都只是元数据,不能在运行时获取。因此,无法检索字符串字面量类型中的有效字符串列表。
解决方法:可以使用数组来声明类型,然后通过数组的`from`方法将类型转换为数组。这样就可以在运行时获取有效字符串列表。
以下是解决方法的示例代码:
type MyType = 'apple' | 'banana' | 'orange'; const myArray: MyType[] = Array.from(['apple', 'banana', 'orange']); console.log(myArray); // ['apple', 'banana', 'orange']
通过以上代码,我们可以将字符串字面量类型`MyType`转换为数组`myArray`,并在控制台打印输出数组的内容。