Typescript'te bir değişken türü nasıl elde edilir?


114

Bir değişkenim var.

abc:number|string;

Türünü nasıl kontrol edebilirim? Aşağıdaki gibi bir şey yapmak istiyorum:

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

Yanıtlar:


176

İçin :

abc:number|string;

JavaScript operatörünü kullanın typeof:

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

Typescript anlar typeof🌹

Buna daktilo denir.

Daha

Sınıflar için instanceoförn.

class Foo {}
class Bar {} 

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

Diğer tip korumalar da vardır mesela invb https://basarat.gitbooks.io/typescript/content/docs/types/typeGuard.html


6
instanceofSorulan soru bu olmasa da üzerine not eklendi .
basarat

43

Bir nesne kullanımı örneğini karşılaştırmak istiyorsanız, TypeGuard'ların yalnızca dizeler veya sayılar üzerinde çalıştığını eklemek isterim.

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

5
Doğru. Worth ile yapabilirsiniz belirterek classtypescript ile es ancak interfacelar ya typeda ihraç JavaScript dosyasında var olmadığın, s.
joeytwiddle

11

Bir değişkenin boole olup olmadığını aşağıdaki gibi kontrol ettim

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

Benzer şekilde bizde

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

ve bunun gibi.


1
benim için çalıştı, ancak sadece türleri bilmek için !!, özel türlerin kullanılması gerekiyorinstanceof
Carlos.V

3
utilBu işlevlere erişmek için import { isString } from 'util';
içeri

1
Şimdi kaldırıldı, bunun yerine if (typeof değeri === 'string') kullanın
Monir Khan

7

Diğer cevaplar doğrudur, ancak arayüzlerle uğraşırken typeof veya instanceof kullanamazsınız çünkü arayüzler javascript'e derlenmez.

Bunun yerine , değişkeninizi kontrol etmek için bir typecast + işlev kontrolü yazım kılavuzu kullanabilirsiniz:

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

Ve ES2017'de derlenmiş JavaScript:

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

Bu, arayüzler ile sınıflar arasında çok önemli bir ayrımdır! Keşke bunu yapmanın daha deyimsel bir yolu olsaydı, ama bu öneri iyi çalışıyor.
Guss

0

Yazı tipinde korumaları yazın

Koşullu bir ifadeden sonra bir değişkenin türünü belirlemek için tür korumalarını kullanabilirsiniz. Daktilo yazısında bir tür koruması aşağıdaki gibidir:

Koşullu bir blok içindeki bir şeyin türünü daraltmanıza izin veren bir ifade.

Başka bir deyişle, typcript derleyicisinin türü daraltmak için yeterli bilgiye sahip olduğu koşullu bir blok içindeki bir ifadedir. Tür, tür koruma bloğu içinde daha spesifik olacaktır çünkü derleyici, tür hakkında daha fazla bilgi çıkarmıştır.

Misal

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

Ayrıca typeofoperatör orada gibi tip korumaları inşa edilir instanceof, inve hatta kendi tip korumalar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.