Подтвердить что ты не робот

Обнаружение динамического интерфейса объекта в TypeScript

Есть ли способ, как я могу определить, реализует ли какой-то объект какой-либо интерфейс?

if(myObj implements IMyInterface) {
    //... do something
}
4b9b3361

Ответ 1

Да. Теперь вы можете сделать это, используя расширенную версию компилятора TypeScript, которая позволяет вам узнать, какой интерфейс реализует каждый класс вашего приложения. Эта версия компилятора хранит информацию всех типов до времени выполнения и связывает эту информацию с фактическими конструкторами. Например, вы можете написать примерно следующее:

function implementsInterface(object: Object, target: Interface) {
    const objClass: Class = object.constructor && object.constructor.getClass();
    if (objClass && objClass.implements) { 
        let found = false;
        for (let base of objClass.implements) {
            let found = interfaceExtends(base, target);
            if (found) {
                return true;
            }
        }
    }
    return false;
}

// recursive interface inheritance check
function interfaceExtends(i: Interface, target: Interface) {
    if (i === target) { 
        return true;
    }
    if (i.extends) {
        let found = false;
        for (let base of i.extends) {
            // do a recursive check on base interface...
            found = interfaceExtends(base, target);
            if (found) {
                return true;
            }
        }
    }
    return false;
}

Вы можете найти полный рабочий пример, который соответствует вашим потребностям здесь

Ответ 2

Нет.

В настоящее время типы используются только во время разработки и компиляции. Информация о типе никак не преобразуется в скомпилированный код JavaScript.

С некоторым генерированием кода компилятором это было бы возможно. На данный момент команда TypeScript пытается добавить как можно меньше кода к окончательному JavaScript, исключение - это ключевое слово 'extends', которое добавляет новый метод к скомпилированному выходу.

Ответ 3

Да, вы можете сделать это с помощью инструментов проверки типов. Посмотрите эту библиотеку: https://github.com/pelotom/runtypes