typescript - Hur bygger man ett objekt baserat på ett strängenum?


Till exempel:

enum App {
  App1 = "my-app1",
  App2 = "my-app2",
}

const AppPaths: {
  [ App.App1 ]: string;
  [ App.App2 ]: string;
} = {
  [ App.App1 ]: "/some/path/to/app1",
  [ App.App2 ]: "/some/path/to/app2",
};

Detta fungerar, men det är långt. Jag skulle vilja förenkla AppPaths så att det i princip är:

const AppPaths: { [ key: keyof App ]: string } = ...

Detta ger felet:

En indexsignaturparametertyp kan inte vara en literatyp eller generisk typ. Överväg att använda en mappad objekttyp istället.

Så jag försökte med en mappad objekttyp:

const AppPaths: { [ key in keyof App ]: string } = ...

// or

const AppPaths: { [ key in keyof typeof App ]: string } = ...

Båda ger felet:

Objektliteral kan endast specificera kända egenskaper, och '[ App.App1 ]' finns inte i typen '{ readonly [x: number]: string; toString: string; charAt: string; charCodeAt: string; concat: string; indexOf: string; lastIndexOf: string; localeCompare: string; match: string; replace: string; search: string; ... 39 till ...; [Symbol.iterator]: string; }

Är det möjligt att förenkla den här objektets typdeklaration?

Svar #1

Givet enum

enum App {
  App1 = "my-app1",
  App2 = "my-app2",
}

typen App är typen du vill kartlägga över. Det är föreningen av värden i enum, liknande "my-app1" | "my-app2". Det leder till:

const AppPaths: { [K in App]: string } = {
  [App.App1]: "/some/path/to/app1",
  [App.App2]: "/some/path/to/app2",
};

Playground-länk till kod