TypeScript: verifica si la clase implementa una interfaz
(1)
A diferencia de las clases, las interfaces solo existen en tiempo de compilación, no se incluyen en el Javascript resultante, por lo que no puede realizar una comprobación de instanceof
.
Podría hacer de IWalkingAnimal
una subclase de Animal (y usar instanceof
), o podría verificar si el objeto en cuestión tiene un método de walk
:
if (animal[''walk'']) {}
Puede envolver esto en una protección de tipo definido por el usuario (de modo que el compilador pueda limitar el tipo cuando se usa en una sentencia if
, al igual que con instanceof
).
/**
* User Defined Type Guard!
*/
function canWalk(arg: Animal): arg is IWalkingAnimal {
return (arg as IWalkingAnimal).walk !== undefined;
}
private moveAnimal(animal: Animal) {
if (canWalk(animal)) {
animal.walk(); // compiler knows it can walk now
}
}
Estoy usando una interfaz en Typescript para definir una función que solo está disponible en algunas de las clases que extienden la clase base. Esta es una versión simplificada del código que tengo hasta ahora:
class Animal {
}
interface IWalkingAnimal {
walk(): void;
}
class Dog extends Animal implements IWalkingAnimal {
}
class Cat extends Animal implements IWalkingAnimal {
}
class Snake extends Animal {
}
private moveAnimal(animal: Animal) {
if (animal instanceof Cat || animal instanceof Dog) {
animal.walk();
}
}
Ahora, el problema es que voy a agregar más animales ''caminando'' para que la función MoveAnimal crezca demasiado para que sea manejable. Lo que me gustaría hacer es algo como esto:
private moveAnimal(animal: Animal) {
if (animal implements IWalkingAnimal ) {
animal.walk();
}
}
Sin embargo, la verificación de ''implementos'' no funciona, y no puedo encontrar un equivalente a ''instanceof'' cuando se usan interfaces. En Java parece que el uso de ''instanceof'' funcionaría aquí, pero TypeScript no lo permitirá.
¿Existe tal cosa en TypeScript, o hay un mejor enfoque aquí? Estoy usando el TypeScript 1.8.9.