2016-04-07 18 views
1

Çalışma zamanı sırasında bir sınıf (örneğini değil!) Ve TypeScript'te bir işlevi ayırt etmenin bir yolu var mı.Sınıf ve işlev arasında ayrım yapma

Normal olarak, yazı tipindeki sınıflar javascript işlevlerine aktarılır ve çalışma sırasında bir tanımlayıcının işlev mi yoksa sınıf tipi mi olduğunu kontrol etmenin güzel bir yolunu bulamadım! Örneğin

: Daha iyi bir çözüm için

function func1() { 
 
\t 
 
} 
 

 
class class1 { 
 
\t 
 
} 
 

 
// ugly hack 
 
(<any>class1.prototype).isclass = true; 
 

 
// ugly hack test 
 
function is_class(clazz:any) { 
 
\t return (
 
\t \t clazz 
 
\t \t && clazz.prototype 
 
\t \t && (<any>clazz.prototype).isclass === true 
 
\t); 
 
} 
 

 
console.log(typeof(func1) === 'function'); // returns true !! 
 
console.log(typeof(class1) === 'function'); // returns true !! 
 

 
console.log(is_class(func1)); // returns false :) 
 
console.log(is_class(class1)); // returns true :)

Herhangi bir fikir? Teşekkürler.

cevap

2

Bunu kesin yapamaz ama class yöntemleri genellikle bu yüzden prototype gitmek gibi, sezgisel bir yaklaşım kullanabilirsiniz::

diğer tüm sınıfları devralan bir sınıf oluşturabilir, söz konusu bu

class Foo { 
    foo(){} 
} 
function foo(){} 
console.log(!!Object.keys(Foo.prototype).length); // true : is class 
console.log(!!Object.keys(foo.prototype).length); // false : is not a class 
+0

Bu temiz bir çözüm gibi görünüyor onaylıyor. Her ikisini de birim testlerimle yürütmek ve sonucu görmek zorundayım. Teşekkür ederim :) – gevik

1

Hayır, ES5'i veya daha azını hedeflerken değil. Eğer ES6 hedefliyorsanız

var class1 = (function() { 
    function class1() { 
    } 
    return class1; 
}()); 

Ancak o zaman anlayabilirsiniz: derlenmiş JavaScript görülebileceği gibi Sınıflar fonksiyonlardır. this answer'a bir göz atın.

class BaseClass { 
    static isClass = true; 
} 

class Class1 extends BaseClass { 

} 

console.log(Class1.isClass); // true 
+0

Teşekkürler, ben de aynı sonuca vardım ve cevabınız – gevik

İlgili konular