javascript - Typescript tilldela en variabel av flera typer som innehåller OR ( | ) till en variabel av en enda typ


Jag har en variabel som har typen nummer eller sträng. Hur kan jag tilldela dess värde till en variabel som endast accepterar nummer?

const id:Record<string, string|number> = {name:3}
let num: Record<string, number>;

num = id; //Shows error here

Jag vet att det kan finnas JavaScript-lösningar som att skriva en konverteringsfunktion, men jag lär mig TypeScript och vill veta om det finns nyckelord eller TypeScript-specifika lösningar som är avsedda att användas i sådana fall, som as Record<string,number>... som kan kasta det, istället för typförklaring

Här är en länk till koden på Typescript-lekplatsen

Svar #1

Det ser ut som att du redan besvarade din fråga, du kan casta med nyckelordet as.

num = id as number

Om du ville vara lite finurlig kunde du kolla id:ets typ med typeof, så något som detta

if (typeof id === 'number') {
  number = id
}

Svar #2

Du kan använda TypeScript 3.7:s assertionsfunktioner för att genomdriva kontrollerna i koden som inte eliminerade fel typ:

const id:Record<string, string|number> = {name:"3"}
let num: Record<string,string>;

//the code logic safely leads to this line only if "id" contains a number value

declare function isNumId(id: Record<string, string | number>): asserts id is Record<string, string>;

isNumId(id);
num = id; // No longer shows error here

Självklart kan det vara enklare att bara säga till TS att vi är säkra på typen:

num = id as Record<string, string>; // No longer shows error here