TypeScript'te sınıf türü denetimi


240

ActionScript'te, is operatörünü kullanarak çalışma zamanında türü kontrol etmek mümkündür :

var mySprite:Sprite = new Sprite(); 
trace(mySprite is Sprite); // true 
trace(mySprite is DisplayObject);// true 
trace(mySprite is IEventDispatcher); // true

Bir değişkenin (genişletme veya) TypeScript ile belirli bir sınıf veya arayüz olup olmadığını tespit etmek mümkün müdür?

Dil özelliklerinde hiçbir şey bulamadım. Sınıflar / arayüzlerle çalışırken orada olmalı.

Yanıtlar:


319

4.19.4 Operatör örneği

instanceofOperatör tip herhangi biri veya 'Fonksiyonu' arayüz tipi bir alt tipte herhangi bir türde olması sol terim, bir nesne türü ya da bir tür parametre türü ve sağ işlenen gerektirir. Sonuç her zaman Boole ilkel tipidir.

Böylece kullanabilirsiniz

mySprite instanceof Sprite;

Bu operatörün de ActionScript'te olduğunu, ancak artık orada kullanılmaması gerektiğini unutmayın:

ActionScript 3.0 için yeni olan is operatörü, bir değişkenin veya ifadenin belirli bir veri türünün üyesi olup olmadığını test etmenizi sağlar. Önceki ActionScript sürümlerinde, instanceof operatörü bu işlevselliği sağlamıştır, ancak ActionScript 3.0'da instanceof operatörü veri türü üyeliğini test etmek için kullanılmamalıdır. Manuel tür denetimi için instanceof operatörü yerine is operatörü kullanılmalıdır, çünkü x instanceof y ifadesi yalnızca x'in prototip zincirini y varlığı açısından kontrol eder (ve ActionScript 3.0'da, prototip zinciri aşağıdakilerin tam bir resmini sağlamaz kalıtım hiyerarşisi).

TypeScript'ler instanceofaynı sorunları paylaşır. Halen geliştirilmekte olan bir dil olduğu için bu tür bir tesisin önerisini belirtmenizi tavsiye ederim.

Ayrıca bakınız:


54

TypeScript, çalışma zamanında bir değişkenin türünü doğrulama yoluna sahiptir. Bir tür yüklem döndüren bir doğrulama işlevi ekleyebilirsiniz . Bu nedenle bu işlevi bir if ifadesi içinde çağırabilir ve bu blok içindeki tüm kodun, düşündüğünüz tür olarak güvenli olduğundan emin olabilirsiniz.

TypeScript dokümanlarından bir örnek:

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

// Both calls to 'swim' and 'fly' are now okay.
if (isFish(pet)) {
  pet.swim();
}
else {
  pet.fly();
}

Daha fazla bilgi için: https://www.typescriptlang.org/docs/handbook/advanced-types.html


29
Bu, çalışma zamanı yazım denetimi değildir, yalnızca bir nesnenin belirli bir özelliği olup olmadığını kontrol eder. Bu, sendika türleri için iyi olabilir, bu nedenle bu özel durum için çalışır, ancak bunun gibi her şey için bir "isThingy" oluşturmak gerçekten mümkün değildir. Ayrıca hem balık hem de kuş yüzebilseydi mahkumdur. Ben bunu yapabilirsiniz güvenilir bir tür denetlemesi yapar Haxe kullanıyorum memnunum Std.is(pet, Fish)arayüzler vb türlerinde çalışır,
Mark Knol'un

4
Bu cevabı faydalı buldum, ancak biraz daha kesin olmak için ayarlayabileceğini düşünüyorum. isFishKendisi oluşturulan yüklem, ve vücudu tek liner yüklem olmak zorunda değildir. Bunun avantajı, derleyicinin derleme zamanında uygun olası işlevleri anlamasıdır, ancak içerideki kodunuz isFishçalışma zamanında yürütülür. Gardiyanın bir instanceofifade içermesini bile sağlayabilirsiniz , örneğin return pet instanceof Fish(bir sınıf değil, bir sınıf olduğunu varsayarak), ancak derleyici instanceofdoğrudan anladığı için bu gereksiz olacaktır .

4
buna "Kullanıcı Tanımlı Tip Korumalar" da denir, bkz. basarat.gitbooks.io/typescript/content/docs/types/…
Julian

@MarkKnol aslında çalışma zamanı kontrolüdür ama tür yazılan türünü de anlama yeteneğini getirir (yani: bana güvenebilirsiniz bu tür X veya Y olacak çünkü çalışma zamanında test edeceğim).
Flavien Volken

3
(pet as Fish)Tslinter şikayet edeceğinden kullanmayı düşünebilirsiniz (<Fish>pet). Bkz tslint doc
Bryan

1

Bunun için instanceofoperatörü kullanabilirsiniz . MDN'den:

İnstanceof operatörü bir kurucunun prototip özelliğinin bir nesnenin prototip zincirinde herhangi bir yerde görünüp görünmediğini test eder.

Hangi prototiplerin ve prototip zincirlerinin olduğunu bilmiyorsanız, aramanızı şiddetle tavsiye ederim. Ayrıca, kavramı netleştirebilecek bir JS (TS bu açıdan benzer çalışır) örneği:

    class Animal {
        name;
    
        constructor(name) {
            this.name = name;
        }
    }
    
    const animal = new Animal('fluffy');
    
    // true because Animal in on the prototype chain of animal
    console.log(animal instanceof Animal); // true
    // Proof that Animal is on the prototype chain
    console.log(Object.getPrototypeOf(animal) === Animal.prototype); // true
    
    // true because Object in on the prototype chain of animal
    console.log(animal instanceof Object); 
    // Proof that Object is on the prototype chain
    console.log(Object.getPrototypeOf(Animal.prototype) === Object.prototype); // true
    
    console.log(animal instanceof Function); // false, Function not on prototype chain
    
    

Bu örnekteki prototip zinciri:

hayvan> Animal.prototype> Object.prototype

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.