Как отличить класс от функции

Есть ли способ отличить класс (а не его экземпляр!) от функции в 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 :)

Любые идеи для лучшего решения? Спасибо.


person gevik    schedule 07.04.2016    source источник


Ответы (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
person basarat    schedule 07.04.2016
comment
Это выглядит как более чистое решение. Я должен запустить оба моих модульных теста и увидеть результат. Спасибо :) - person gevik; 08.04.2016

Нет, не при нацеливании на ES5 или ниже. Классы — это функции, которые можно увидеть в скомпилированном JavaScript:

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

Однако, если вы ориентируетесь на ES6, вы можете это сказать. Взгляните на этот ответ.

Тем не менее, вы можете создать класс, от которого наследуются все остальные классы:

class BaseClass {
    static isClass = true;
}

class Class1 extends BaseClass {

}

console.log(Class1.isClass); // true
person David Sherret    schedule 07.04.2016
comment
Спасибо, я пришел к такому же выводу, и ваш ответ подтверждает, что - person gevik; 07.04.2016