javascript - Tilldela egenskaper från ett objekt till ett annat objekt i typescript


Jag har två objekt med många egenskaper. Jag vill kopiera egenskaper från ett objekt till det andra endast om de är definierade.

Här är objektgränssnittet:

interface Settings {
  locale: string;
  currency: string;
  style: string;
  isDark: boolean;
  // There are more fields here
}

De två objekten definieras så här:

const settings: Settings = {/*assign all fields here*/}
const settingsChange: Partial<Settings> = {/*change some fields*/}

Nu behöver jag tilldela fälten i settingsChange till settings, jag försöker göra detta precis som jag skulle göra det i javascript

Object.entries(settingsChange).forEach(([key, value])=>{
  settings[key] = settingsChange[key] || settings[key]
})

Här är TypeScript-lintningsfelet jag får:

Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'Settings'.
No index signature with a parameter of type 'string' was found on type 'Settings'.ts(7053)

Hur löser jag detta? Jag vet att Object.assign skulle fungera men Object.entries ger mig mer frihet att tillämpa vilken logik jag behöver.

Svar #1

settings = {
  ...settings,
  ...settingsChange
};

Du kan göra något liknande om du behöver utföra någon logik på värdena:

settings = Object.fromEntries(Object.entries(settings).map(([key, value]) => {
  const newValue = (settingsChange as keyof Settings)[key] ?? value;
  return [key, newValue];
})) as Settings;