Kako dobiti tip varijable u Typescriptu?


Imam varijablu.

abc:number|string;

Kako mogu provjeriti njegov tip? Želim napraviti nešto poput ovoga:

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

Odgovor #1

Za :

abc:number|string;

Koristite JavaScript operator typeof:

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

TypeScript razumije typeof 🌹

Ovo se zove zaštita tipa.

Više

Za klase biste koristili instanceof, npr.

class Foo {}
class Bar {} 

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

Postoje i druge vrste zaštitnika tipa, npr. in itd. https://basarat.gitbook.io/typescript/type-system/typeguard

Odgovor #2

Ostali odgovori su točni, ali kada radite s sučeljima ne možete koristiti typeof ili instanceof jer se sučelja ne prevode u JavaScript.

Umjesto toga možete koristiti typecast + provjeru funkcije kao tip stražara da provjerite svoju varijablu:

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();
    }
}

A ovo je kompajlirani JavaScript u ES2017:

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

Odgovor #3

Htio bih dodati da TypeGuards rade samo na stringovima ili brojevima, ako želite usporediti objekt koristite instanceof

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

Odgovor #4

Sumnjam da možete malo prilagoditi svoj pristup i koristiti nešto slično primjeru ovdje:

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;
}

Odgovor #5

Provjerio sam varijablu je li Boolean ili nije kao u nastavku

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

Slično imamo

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

i tako dalje.

Odgovor #6

Čuvari tipova u typescriptu

Za određivanje tipa varijable nakon uvjetne izjave možete koristiti zaštite tipa. Zaštita tipa u TypeScriptu je sljedeća:

Izraz koji vam omogućuje suziti vrstu nečega unutar uvjetnog bloka.

Drugim riječima, to je izraz unutar uvjetnog bloka iz kojeg TypeScript prevoditelj ima dovoljno informacija da suzi tip. Tip će biti specifičniji unutar bloka zaštite tipa jer je prevoditelj zaključio više informacija o tipu.

Primjer

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')
}

Osim operatora typeof, postoje ugrađeni čuvari tipova poput instanceof, in pa čak i vlastiti čuvari tipova.

Povezani članci