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
