javascript - TypeScript - Att skilja mellan null-typ och null-objektvärde
Jag migrerar viss JS-kod till TS och jag ställs inför ett problem med att skilja mellan en null-typ i TypeScript och bara ge ett null-värde till ett fält i ett objekt.
Här är ett exempel:
export const performProcedure = () => {
let newPerson = {
name: null,
birthdate: null
}
if (<someCheck>) {
newPerson.name = "Default name";
}
...
}
När det gäller JS fungerar koden ovan. Men när jag inkluderar TS får jag ett felmeddelande som säger att Type 'Default name' is not assignable to type 'null'. Det verkar göra detta eftersom TS nu tolkar name : null som att name är av typen null, vilket inte är vad jag vill. Jag vill bara initialisera den till null.
Hur kan jag kringgå mitt problem?
Svar #1
Typescript har konstaterat att newPerson.name har typen "null" eftersom du satte null där. Det bästa sättet att kringgå det är att vara så specifik som möjligt. Om du vill tillåta både null-värden och strängar, skapa ett gränssnitt som säger det:
interace Person {
name: string | null;
birthdate: Date | null;
}
let newPerson: Person = { ... }
Detta är mest explicit. Ett troligen bättre sätt är att använda undefined istället för null. Då kan du bara använda valfritt parameter:
interace Person {
name?: string;
birthdate?: Date;
}
Det är värt att notera att om du aktiverar alla strikta kontroller i din tsconfig, kan du inte skicka null till en egenskap som är definierad som string. Och det är en bra sak, du vill inte se något felmeddelande som "Kan inte läsa egenskapen 'length' av null".
Svar #2
Du kan tala om för TypeScript att name ska vara en sträng.
let newPerson = {
name: <string>null,
birthdate: null
}
Det skulle vara ännu bättre att ha ett Person-gränssnitt.
interace Person {
name: string;
birthdate: Date;
}
let newPerson: Person = {
name: null,
birthdate: null
};
