typescript - Hur man korrekt begränsar typen `unknown`


tl;dr varför gör

const func = (a: unknown) => {
  if (a && typeof a === 'object' && 'b' in a) {
    a.b;
  }
};

Visa följande felmeddelande

Property 'b' does not exist on type 'object'.

?

Redigera: Efter att ha undersökt detta mer noggrant har jag ett ännu mer minimalt exempel. Så låt mig omformulera min fråga:

Hur man sannolikt begränsar object-typen i TypeScript?

tl;dr varför gör

const func = (a: object) => {
  if ('b' in a) {
    a.b;
  }

ge följande felmeddelande:

Property 'b' does not exist on type 'object'.

?

Svar #1

Du borde ta en närmare titt på anpassad typvakt. De låter i princip kompilatorn veta att om villkoret uppfylls, kommer det kontrollerade värdet att ha en specifik typ.

I ditt fall:

  1. Definiera en anpassad typvakt
const hasB = (value: unknown): value is { b: unknown } => {
  return (
    typeof value === 'object'
    && value !== null
    && 'b' in value
  );
}
  1. Kontrollera ditt värde med det
const func = (a: unknown) => {
  if (hasB(a)) {
    a.b;
  }
};

Lekplats exempel

Relaterade artiklar