如何从字符串数组构建Typescript类型?
到目前为止,我有这个如何从字符串数组构建Typescript类型?,typescript,typescript-typings,Typescript,Typescript Typings,到目前为止,我有这个 export const PacerThemes=['Default','Dark Muted','Neon']作为常量; 导出类型PacerTheme=PacerTheme的类型[编号]; 键入以下属性={ 呼气HoldBorderColor:字符串; 呼气保持颜色:字符串; 颜色:字符串; 颜色:字符串; }; 类型主题={ 默认值:ThemeProperties; “黑暗沉默”:他们的财产; 氖:他们的财产; }; 是否有一种方法可以从PacerThemes数组生成
export const PacerThemes=['Default','Dark Muted','Neon']作为常量;
导出类型PacerTheme=PacerTheme的类型[编号];
键入以下属性={
呼气HoldBorderColor:字符串;
呼气保持颜色:字符串;
颜色:字符串;
颜色:字符串;
};
类型主题={
默认值:ThemeProperties;
“黑暗沉默”:他们的财产;
氖:他们的财产;
};
是否有一种方法可以从PacerThemes
数组生成主题
类型?如评论中所建议,您可以使用
type ThemeNames = "Default" | "Dark Muted" | "Neon";
type ThemeProperties = {
exhaleHoldBorderColor: string;
exhaleHoldColor: string;
inhaleHoldBorderColor: string;
inhaleHoldColor: string;
};
type Themes = {
[T in ThemeNames]: ThemeProperties;
};
或者你可以用一个
键入ThemeNames=“Default”|“暗静音”|“霓虹灯”;
键入以下属性={
呼气HoldBorderColor:字符串;
呼气保持颜色:字符串;
颜色:字符串;
颜色:字符串;
}
类型主题=记录
这里有一个解决方案():
如果您想通过引入一些可重用的帮助器类型使其更通用,您可能会遇到这样的问题:
readonly any[]
不扩展any[]
例如,这不起作用,因为typeof PacerThemes
是readonly
:
type Items<A extends any[]> = A[keyof A & number]
类型项目):
const-PacerThemes=['Default','Dark-Muted','Neon']作为常量
//版本1--只允许只读数组
类型ReadonlyItems=P[keyof P&number]
类型TestVersion1=非限制项
键入属性版本1={
[k在ReadonlyItems中]:“您的类型”
}
//版本2——允许两者同时使用
类型非限制项
=P[keyof P&number]
类型TestVersion2=非限制项
键入属性版本2={
[k在非限制项中]:“YourType”
}
键入主题={[ThemeName in PacerTheme]:ThemeProperties;}代码>@GarlefWegart@GarlefWegart。我真的不确定你提到的哪个东西不起作用。@VLAZ--re:“它不起作用”。哦,对了。我的错误。我以为你打错了,打算写PacerTheme\u s
(用PacerTheme
作为索引是行不通的)。[我删除了我的评论,这样就不会有误传了。]你的建议很好。是的。映射类型是正确的做法。但是,您可以在不显式定义themename
类型的情况下解决此问题。看看我的答案。@kasv谢谢你的回答。我喜欢这个,但它不能完全回答问题。我使用数组定义主题名称的原因是将其映射到一个菜单PacerThemes.map((pacerTheme:pacerTheme)=>
.True)。但是,使用这种方法,您可以始终使用生成的数据结构映射到-对象.key(mythimes).map(key=>{…})
谢谢Garlef。这正好回答了这个问题。
const PacerThemes = ['Default', 'Dark Muted', 'Neon'] as const
type ThemePropertiesVersion = {
[k in (typeof PacerThemes)[keyof typeof PacerThemes & number]]: "YourType"
}
type Items<A extends any[]> = A[keyof A & number]
const PacerThemes = ['Default', 'Dark Muted', 'Neon'] as const
// Version 1 -- allow only readonly arrays
type ReadonlyItems<P extends readonly any[]> = P[keyof P & number]
type TestVersion1 = NonRestrictiveItems<typeof PacerThemes>
type ThemePropertiesVersion1 = {
[k in ReadonlyItems<typeof PacerThemes>]: "YourType"
}
// Version 2 -- allow both
type NonRestrictiveItems<P extends (readonly any[]) | any[]> = P[keyof P & number]
type TestVersion2 = NonRestrictiveItems<typeof PacerThemes>
type ThemePropertiesVersion2 = {
[k in NonRestrictiveItems<typeof PacerThemes>]: "YourType"
}