如何区分class和函数
How to distinguish between a class and function
有没有办法在运行时区分 class(不是它的实例!)和 TypeScript 中的函数。
通常 classtypescript 中的 es 被转换为 javascript 函数,在运行时我找不到一个很好的方法来检查标识符是函数还是 class 类型!
例如:
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 :)
有更好的解决方案吗?
谢谢
不,当以 ES5 或更低版本为目标时不会。 类 是在编译的 JavaScript:
中可以看到的函数
var class1 = (function () {
function class1() {
}
return class1;
}());
但是,如果您的目标是 ES6,那么您就可以分辨出来。看看.
也就是说,您可以创建一个 class,所有其他 class 继承自:
class BaseClass {
static isClass = true;
}
class Class1 extends BaseClass {
}
console.log(Class1.isClass); // true
你不能明确地但你可以使用启发式方法,因为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
有没有办法在运行时区分 class(不是它的实例!)和 TypeScript 中的函数。
通常 classtypescript 中的 es 被转换为 javascript 函数,在运行时我找不到一个很好的方法来检查标识符是函数还是 class 类型!
例如:
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 :)
有更好的解决方案吗? 谢谢
不,当以 ES5 或更低版本为目标时不会。 类 是在编译的 JavaScript:
中可以看到的函数var class1 = (function () {
function class1() {
}
return class1;
}());
但是,如果您的目标是 ES6,那么您就可以分辨出来。看看
也就是说,您可以创建一个 class,所有其他 class 继承自:
class BaseClass {
static isClass = true;
}
class Class1 extends BaseClass {
}
console.log(Class1.isClass); // true
你不能明确地但你可以使用启发式方法,因为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