Försöker tilldela flera keyof till ett dynamiskt destrukturerat objekt i Typescript
Här är ett fungerande exempel för att illustrera min fråga.
interface Definition {
oneTitle: string
oneDescription: string
twoTitle: string
twoDescription: string
}
const obj = {
oneTitle: 'Title 1',
oneDescription: 'Desc 1',
twoTitle: 'Title 2',
twoDescription: 'Desc 2'
}
type Keys = 'one' | 'two'
const keys: Keys[] = [
'one',
'two'
]
keys.forEach((key) => {
const {
[`${key}Title` as keyof Definition]: title,
[`${key}Description` as keyof Definition]: description,
} = obj
})
Som du kan se finns det en dynamisk objektavstrukturering, t.ex. [`$ {key}Title`]. Jag skulle vilja veta om det i det fallet finns ett sätt i Typescript att undvika att definiera as keyof Definition flera gånger för varje nyckel?
Jag har provat följande saker utan någon framgång.
const {
[`${key}Title`]: title,
[`${key}Description`]: description,
}: Record<keyof Definition, Definition> = config
const {
[`${key}Title`]: title,
[`${key}Description`]: description,
}: {[key in keyof Definition]: Definition} = config
Faktiskt, eftersom jag får det felet i båda fallen har ingen motsvarande indexsignatur för typen 'string', verkar det som att Typescript tolkar den dynamiska nyckeln som en sträng snarare än en keyof av typen Definition.
Tack för din hjälp (:
Svar #1
Det är inte en stor förbättring, men om du förhindrar automatisk typvidgning på 2 ställen kan du ta bort behovet av as keyof Definition, även om koden fortfarande kommer att vara lite upprepande. Deklarera keys-arrayen as const så att den inte vidgas till string[], och deklarera egenskapsåtkomstern as const så att den inte heller vidgas till string.
const keys = [
'one',
'two'
] as const;
keys.forEach((key) => {
const {
[`${key}Title` as const]: title,
[`${key}Description` as const]: description,
} = obj
})
