Destrukturering av valfria egenskaper i Typescript


Anta att jag har ett objekt med valfria egenskaper av denna typ av form

interface MyObject {
  requiredProp: SomeType;
  optionalProp?: { 
    innerData: {
      innerProp1: string;
      innerProp2: number;
      innerProp3?: boolean;
    }
  }
}

const obj:MyObject = { ... }

Men det verkar som att jag inte enkelt kan destrukturera det optionalProp

const {innerProp1, innerProp2, innerProp3} = obj.optionalProp?.innerData;

eftersom

Egenskapen 'innerProp1' finns inte på typen '... | undefined'.

och samma för resten av de destrukturerade variablerna.

Finns det ett elegant och kort sätt att göra detta på samtidigt som typ säkerheten behålls?

Svar #1

Du kan använda det tomma objektet som en reserv.

const {innerProp1, innerProp2, innerProp3} = obj.optionalProp?.innerData ?? {};

Men du bör komma ihåg att kontrollera att varje innerProp inte är odefinierad innan du använder den.

Svar #2

Förutom de andra korrekta svaren kan detta också hanteras på några andra sätt...

  1. Genom att ge ett värde så att destrukturering kan tillfredsställas i fallet undefined eller null
const { innerProp1, innerProp2, innerProp3 } = obj.optionalProp?.innerData || {};
  1. Genom att göra en null-ness-kontroll av optionalProp innan destrukturering.
if (obj.optionalProp) {
    const { innerProp1, innerProp2, innerProp3 } = obj.optionalProp?.innerData;
}

Relaterade artiklar