Hur får man en variabeltyp i Typescript?


Jag har en variabel.

abc:number|string;

Hur kan jag kontrollera dess typ? Jag vill göra något som nedan:

if (abc.type === "number") {
    // do something
}

Svar #1

För :

abc:number|string;

Använd JavaScript-operatorn typeof:

if (typeof abc === "number") {
    // do something
}

TypeScript förstår typeof 🌹

Detta kallas en typvakt.

Mer

För klasser skulle du använda instanceof t.ex.

class Foo {}
class Bar {} 

// Later
if (fooOrBar instanceof Foo){
  // TypeScript now knows that `fooOrBar` is `Foo`
}

Det finns också andra typer av skydd, t.ex. in etc. https://basarat.gitbook.io/typescript/type-system/typeguard

Svar #2

De andra svaren är rätt, men när du hanterar gränssnitt kan du inte använda typeof eller instanceof eftersom gränssnitt inte kompileras till JavaScript.

Istället kan du använda en typecast + funktionskontroll typvakt för att kontrollera din variabel:

interface Car {
    drive(): void;
    honkTheHorn(): void;
}

interface Bike {
    drive(): void;
    ringTheBell(): void;
}

function start(vehicle: Bike | Car ) {
    vehicle.drive();

    // typecast and check if the function exists
    if ((<Bike>vehicle).ringTheBell) {
        const bike = (<Bike>vehicle);
        bike.ringTheBell();
    } else {
        const car = (<Car>vehicle);
        car.honkTheHorn();
    }
}

Och detta är den kompilerade JavaScript i ES2017:

function start(vehicle) {
    vehicle.drive();
    if (vehicle.ringTheBell) {
        const bike = vehicle;
        bike.ringTheBell();
    }
    else {
        const car = vehicle;
        car.honkTheHorn();
    }
}

Svar #3

Jag skulle vilja tillägga att TypeGuards bara fungerar på strängar eller siffror, om du vill jämföra ett objekt, använd instanceof

if(task.id instanceof UUID) {
  //foo
}

Svar #4

Jag misstänker att du kan justera ditt tillvägagångssätt lite och använda något i stil med exemplet här:

https://www.typescriptlang.org/docs/handbook/2/narrowing.html#using-type-predicates

function isFish(pet: Fish | Bird): pet is Fish {
  return (pet as Fish).swim !== undefined;
}

Svar #5

Jag har kontrollerat en variabel om den är en boolean eller inte som nedan

console.log(isBoolean(this.myVariable));

På samma sätt har vi

isNumber(this.myVariable);
isString(this.myvariable);

och så vidare.

Svar #6

Typvakter i TypeScript

För att bestämma typen av en variabel efter ett villkorsuttryck kan du använda typkontroller. En typkontroll i TypeScript är följande:

Ett uttryck som låter dig avgränsa typen av något inom ett villkorsblock.

Med andra ord är det ett uttryck inom ett villkorsblock där TypeScript-kompilatorn har tillräcklig information för att begränsa typen. Typen kommer att vara mer specifik inom blocket för typvakt eftersom kompilatorn har dragit slutsatsen av mer information om typen.

Exempel

declare let abc: number | string;

// typeof abc === 'string' is a type guard
if (typeof abc === 'string') {
    // abc: string
    console.log('abc is a string here')
} else {
    // abc: number, only option because the previous type guard removed the option of string
    console.log('abc is a number here')
}

Förutom typeof-operatorn finns det inbyggda typvakter som instanceof, in och till och med dina egna typvakter.

Relaterade artiklar