Cuándo usar una interfaz o clase en Typescript
Tengo un escenario sencillo de un inicio de sesión que requiere que el usuario introduzca un correo electrónico y una contraseña en Typescript. Necesito crear algún tipo para que esto sea fuertemente tipado y enviarlo al back-end.
¿Debería esto escribirse como:
export interface UserLogin {
email: string;
password: string;
}
//OR
export class UserLogin {
email: string;
password: string;
}
¿Y cómo saber cuándo es el escenario para usar cualquiera de estos?
Respuesta #1
En su forma más básica, una clase es esencialmente una fábrica de objetos (es decir, un plano de cómo se supone que debe ser un objeto y luego implementado), mientras que una interfaz es una estructura utilizada únicamente para verificación de tipo.
Mientras que una clase puede tener propiedades y métodos inicializados para ayudar a crear objetos, una interfaz esencialmente define las propiedades y el tipo que un objeto puede tener.
En el escenario que describiste, uno usaría la interfaz para establecer el tipo para UserLogin.
Respuesta #2
Si solo necesitas declarar un tipo personalizado, entonces usa interfaces. En mi opinión, hay una razón muy pragmática: no se transpilan a JavaScript, por lo que el código generado es más corto.
Las interfaces no funcionarán si necesitas instanciar objetos con constructores o usar un framework que los instancie e inyecte. Entonces usa clases o clases abstractas.
Respuesta #3
De hecho, ambos harán el trabajo. Sin embargo, te sugeriría usar interfaces si solo haces verificación de tipos, ya que están diseñadas específicamente para ese propósito.
Las clases y las interfaces son estructuras poderosas que facilitan no solo la programación orientada a objetos, sino también la verificación de tipos en TypeScript. Una clase es un plano a partir del cual podemos crear objetos que comparten la misma configuración: propiedades y métodos. Una interfaz es un grupo de propiedades y métodos relacionados que describen un objeto, pero no proporciona implementación ni inicialización para ellos.
De: https://toddmotto.com/classes-vs-interfaces-in-typescript
Respuesta #4
envíalo al back-end
Enviar clases por la red requiere un esfuerzo adicional: si utilizas el tipo de contenido JSON, tu clase llegará como un objeto simple a tu código de back-end. Consulta numerosas respuestas a esta pregunta que explican cómo convertir JSON de nuevo a un objeto de clase para que sea posible llamar a sus métodos.
Pero dado que la clase en tu pregunta no tiene métodos, no importa, a menos que el código del back-end realice verificaciones en tiempo de ejecución usando instanceof.
Para evitar estos problemas, utilice una interfaz que solo tenga miembros de datos para representar objetos al comunicarse con el back-end.