2016-04-07 18 views
1

是否有一種方法可以在運行時區分類(不是它的實例!)和TypeScript中的函數。如何區分類和函數

通常,在typescript中的類會被轉換爲javascript函數,並且在運行時我無法找到一個很好的方法來檢查標識符是函數還是類類型!

例如:

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 :)

一個更好的解決方案的任何想法? 謝謝。

回答

2

你不能做到這一點明確但你可以用啓發式,作爲class方法一般去prototype這樣:

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

這看起來像一個更清潔的解決方案。我必須通過我的單元測試運行並查看結果。謝謝 :) – gevik

1

不,不是針對ES5或更低版本時。類是可以在編譯的JavaScript中看到的函數:

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

但是,如果您的目標是ES6,那麼您可以告訴。看看this answer

這就是說,你可以創建一個類,所有其他類繼承:

class BaseClass { 
    static isClass = true; 
} 

class Class1 extends BaseClass { 

} 

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

謝謝,我得出了同樣的結論,你的回答證實 – gevik

相關問題