Kan jag definiera en array av strängar och undefined i TypeScript?


Jag har definierat följande array i TypeScript: let ids: string[]=[];. Sedan när jag försöker lägga till ett id (som kan vara undefined) får jag ett kompileringsfel: ids.push(id); ger mig följande kompileringsfel:

TS2345: Argument av typen 'string | undefined' kan inte tilldelas parametern av typen 'string'. Typen 'undefined' kan inte tilldelas typen 'string'.

Kan jag skapa en array av strängar och undefined?

Svar #1

Ja :

let ids: (string | undefined)[] = [];

Svar #2

Jag misstänker att du kan ha aktiverat strict eller strictNullChecks-flaggan i din kompilatorinställning (antingen via kommandoraden när du kör tsc eller i tsconfig.json-filen).

I strikt nulllägeskontrollläge är värdena null och undefined inte inom varje typs domän och kan endast tilldelas sig själva och any (den enda undantaget är att undefined också kan tilldelas void). [1]

Som ett exempel kan vi reproducera detta med denna exempel kod,

let ids: string[] = [];
let x: string | undefined;
x = Math.random() > 0.5 ? undefined : 'hello';
ids.push(x);

Här kan kompilatorn inte avgöra om x kommer att vara undefined eller en string. (Observera att om du gör x='hello', då kan kompilatorn statisk kontrollera att x inte är undefined vid körning)

Vi kommer att kompilera detta med flaggan strict aktiverad (vilket också aktiverar flaggan strictNullChecks)

Vi får följande kompilatorfel

src/main.ts:4:10 - error TS2345: Argument of type 'string | undefined' is not assignable to parameter of type 'string'.
  Type 'undefined' is not assignable to type 'string'.

4 ids.push(x);
           ~

Så du kanske vill antingen definiera ids-variabeln som (string | undefined)[] som ett annat svar föreslår eller överväga att inaktivera de strikta flaggorna.

En annan möjlig lösning är att använda ! (operatorn för icke-null-assertion) för att kringgå kompilatorn (men du ignorerar avsiktligt en potentiell bugg i många situationer genom att använda detta eftersom kompilatorn inte längre kan hjälpa dig),

ids.push(x!);

Relaterade artiklar