如何区分类和功能

时间:2016-04-07 19:21:19

标签: typescript typescript1.8

有没有办法在运行时区分类(不是它的实例!)和TypeScript中的函数。

通常,typescript中的类被转换为javascript函数,在运行时我找不到一种很好的方法来检查标识符是函数还是类类型!

例如:

function func1() {
	
}

class class1 {
	
}

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

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

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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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