如何从字符串数组构建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"
}