Búsqueda de sitios web

Detectar si un objeto implementa una interfaz en TypeScript dinámicamente


¿Hay alguna manera de cómo puedo detectar si algún objeto implementa alguna interfaz?

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

Respuesta #1

No.

Actualmente, los tipos se utilizan solo durante el desarrollo y el tiempo de compilación. La información de tipos no se traduce de ninguna manera al código JavaScript compilado.

Con algo de generación de código por parte del compilador esto sería posible. Por ahora, el equipo de TypeScript está intentando añadir la menor cantidad de código posible al JavaScript final, siendo la excepción la palabra clave 'extends', que añade un nuevo método al resultado compilado.

Respuesta #2

Sí, si usas el compilador reflec-ts en lugar del compilador estándar tsc. Esta versión mejorada del compilador de TypeScript permite que sepas qué interfaz implementa cada clase de tu aplicación. Esta versión del compilador almacena toda la información de tipos hasta el tiempo de ejecución y vincula esta información a los constructores reales. Por ejemplo, puedes escribir algo como lo siguiente:

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;
}

Puedes encontrar un ejemplo completo que funcione y se ajuste a tus necesidades aquí

Artículos relacionados