javascript - Varför klagar typescript på att ett objekts nyckel är odefinierad även om det föregående kommandot sätter ett värde till den nyckeln?


type MaybeThereIsAValue = {
  [p: string]: string | undefined
}

...

let bar: MaybeThereIsAValue = {};
const key = "carpe";
bar[key] = "diem";

const why = bar[key];
// why is string | undefined

Varför är why string | undefined eftersom jag bokstavligen tilldelar ett värde till bar[key] på raden innan ?

Hur kan jag undvika det?

Kolla exempel här

Svar #1

Jag förstod varför det skulle få det.

Det beror på att strictNullChecks i tsconfig är inställt på true, vilket som standard är false,

och const key='carpe' körs först efter att TS har kompilerats till JS, så TS vet inte vilken nyckel det är.


strictNullChecks: Vid typkontroll, ta hänsyn till null och undefined.


Så om du vill lösa det, är mina två lösningar:

1. ställ in strictNullChecks i tsconfig till false

2. Använd ! icke-null påståenden operator

const why = bar[key]!;

Låt oss tänka på denna situation:

let key = 'carpe';
bar[key] = 'diem';
// the next line would only be executed after the TS is compiled into JS.
key = 'test';  
// that is to say TS does not know the key is 'test' or 'carpe'
// so `why` is type of string or undefined

const why = bar[key];

Om du sätter strictNullChecks till false, kommer why alltid att vara av typen string

Relaterade artiklar