2016-04-07 9 views
1

Gibt es eine Möglichkeit, während der Laufzeit zwischen einer Klasse (nicht ihrer Instanz!) Und einer Funktion in TypeScript zu unterscheiden?So können Sie zwischen einer Klasse und einer Funktion unterscheiden

Normalerweise werden Klassen in Typoskripts in Javascript-Funktionen umgewandelt und während der Laufzeit konnte ich keine nette Methode finden, um zu überprüfen, ob ein Bezeichner eine Funktion oder eine Klassenart ist!

Zum Beispiel:

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

Alle Ideen für eine bessere Lösung? Danke.

Antwort

2

Sie können es nicht tun endgültig aber Sie können eine Heuristik verwenden, da class Verfahren in der Regel auf prototype gehen so:

+0

Dies sieht aus wie eine sauberere Lösung. Ich muss beide Unit-Tests durchlaufen und das Ergebnis sehen. Vielen Dank :) – gevik

1

Nein, nicht bei ES5 oder niedriger. Die Klassen sind Funktionen wie in der kompilierten JavaScript zu sehen:

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

Wenn Sie jedoch ES6 zielen, dann können Sie sagen. Werfen Sie einen Blick auf this answer.

Das heißt, können Sie eine Klasse erstellen, die alle anderen Klassen erben:

class BaseClass { 
    static isClass = true; 
} 

class Class1 extends BaseClass { 

} 

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

Danke, ich kam zu der gleichen Schlussfolgerung und Ihre Antwort bestätigt, dass – gevik

Verwandte Themen