Búsqueda de sitios web

typescript - La interfaz TS no obliga a los implementadores a seguir la firma de las funciones


interface test{
    foo(boo:string);
}
class coo implements test{
    foo(){
        
    }
}

En el playground esto no genera un error aunque la firma de la función no sea como dice la interfaz, el comportamiento esperado de la interfaz es forzar la firma.

¿Por qué es esto?

Respuesta #1

Esto es interesante. El equipo de TypeScript es bastante inteligente y decidieron hacer esto deliberadamente.

La idea es que si tu función puede funcionar correctamente sin recibir un argumento, puede ignorar el argumento de manera segura y satisfacer la interfaz. Esto significa que puedes sustituir tu implementación sin tener que actualizar todo el código que llama a la función.

La interfaz garantiza que el argumento se pase en todos los casos en los que estás usando la interfaz, por lo que obtienes verificación de tipos en los llamadores y en realidad no importa que tu clase concreta no necesite ningún parámetro.

Parámetro de Función de Interfaz No Forzado

Respuesta #2

No estoy satisfecho con que la interfaz tampoco haga cumplir la firma del método. Creo que las explicaciones de Fenton están equivocadas. La verdadera razón es que TypeScript está usando "tipado de pato". No hay errores con menos parámetros, pero sí obtienes errores si usas más parámetros. La respuesta larga se puede encontrar aquí: Por qué se permite el tipado de pato para clases en TypeScript

Al final, la Interfaz no puede cumplir el papel de una clase abstracta que es extendida por otra clase. No recomendaría usar Interfaz con clases, sino que es mejor usar la palabra "implements" en una clase real, hace lo mismo sin la clase Interfaz adicional.

Artículos relacionados