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!);
