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.
