Hvordan ignorere feilen «mangler følgende egenskaper» i TypeScript?


Jeg lager et objekt slik.

interface obj {
  x: number;
  y: number;
  deep?: {
    z: number;
  };
}

let obj: obj = {}; // Type '{}' is missing the following properties from type 'obj': x, y 
    ^^^

Jeg kunne bruke et valgfritt felt. Men når jeg vil få tilgang til det valgfrie feltet, må jeg bruke nullish-operatoren.

// But I don't want to use nullish operator
obj.deep?.z; 

// without nullish operator.
obj.deep.z;  // Object is possibly 'undefined'.
^^^^^^^^
// this is valid unless some condition (like is async function where its not "undefined" anymore);

Fordi valgfeltet krever nullish-operator. Jeg trenger en måte å ignorere typefeilen for "påkrevde egenskaper".

Svar #1

Du kan bruke en typepåstand for å fortelle kompilatoren at verdien din {} er et obj:

let obj = {} as obj;

Typepåstander er nyttige i situasjoner hvor du vet mer om typen til en verdi enn det kompilatoren kan verifisere. Du forteller det bare hva du vet om verdien, og kompilatoren tror deg (noen ganger krever dette en ekstra påstand som as unknown as obj, men du kan til slutt få kompilatoren til å tro deg). Dette flytter byrden av å opprettholde typesikkerhet bort fra kompilatoren og over på deg. Siden kompilatoren bare tror deg, vil den ikke fange situasjonen der du lyver for den. Verdien {} er ikke en gyldig obj, og ved å bruke en typepåstand for å si at det er det, forteller du en løgn til kompilatoren.

Dette er ikke så ille som jeg kanskje får det til å høres ut; hvis du har til hensikt å umiddelbart initialisere obj slik at, når noen andre interagerer med det, vil det være en riktig instans av obj, så er det en hvit løgn. Du vil bare at kompilatoren skal «se bort» mens du initialiserer variabelen:

let obj = {} as obj; // this is a lie
// DANGER ZONE
obj.x = 1;
obj.y = 2;
obj.deep = {} as { z: number };
obj.deep.z = 123;
// END DANGER ZONE
// obj is no longer a lie
obj.deep.z.toFixed(); // no error

Men du bør være forsiktig med denne typen tilnærming. Hvis du ikke klarer å initialisere variabelen riktig, vil det bli et problem ved kjøretid. Av denne grunn prøver jeg vanligvis å refaktorere koden min slik at det ikke er noen periode der den bare er delvis konfigurert:

let badObj = { x: 1, y: 2 }
let deep = { z: 3 }; // get this from somewhere else, awaited or whatever
let goodObj: obj = Object.assign(badObj, { deep }); // okay

Lekeromlenke

Relaterte artikler