Czy istnieje shorthand w warunkowej ustawieniu opcjonalnej własności?

Powiedzmy, że mam ten interfejs:

interface MyInterface {
    someProp?: string;
    someOtherProp: string;
}

Jeśli warunkowo ustawić nieruchomość, muszę wybrać między pewną wartością i niezdefiniowaną. Ale jeśli nie ustawiam wartości, nie chcę tam nieruchomości. Obecnie jedynym sposobem, w jaki mogę myśleć, czy to:

let object: MyInterface = {
    someOtherProp: "asd"
};
if (someCondition) object.someProp = "asdf";

Szukam czegoś wzdłuż linii tego:

let object: MyInterface = {
    someProp: someCondition ? "asdf"
}
3
essi 27 luty 2019, 18:39

2 odpowiedzi

Najlepsza odpowiedź

Istnieje sposób przy użyciu notacji rozprzestrzeniania nieruchomości, ale obejmuje (przynajmniej w teorii), tworząc tymczasowy obiekt, który natychmiast kwalifikuje się do GC:

let object: MyInterface = {
    someOtherProp: "asd",
    ...(someCondition ? {someProp: "asdf"} : null)
};

Przykład na żywo:

function create(someCondition) {
  return {
      someOtherProp: "asd",
      ...(someCondition ? {someProp: "asdf"} : null)
  };
}

console.log(create(true));
console.log(create(false));

Działa to, ponieważ właściciel rozprzestrzeniania się w milczeniu ignoruje go, jeśli wartość jest stosowana do undefined lub null. (Jest inny niż iterable ), który nie.)

Ponieważ jest składnia, w teorii przynajmniej silnik JavaScript może zoptymalizować go, jeśli był to hotspot. Nie mam pojęcia, czy one do (prawdopodobnie jeszcze nie, nadal jest stosunkowo nowy), ale ...

5
T.J. Crowder 27 luty 2019, 15:47

Możesz użyć przydzielania obiektu do warunkowego scalania - uważam tę opcję najbardziej czytelny, osobiście.

let object = Object.assign({ someOtherProp: "asd" }, someCondition ? { someProp: "asdf" } : { });
3
caesay 27 luty 2019, 15:44