¿Qué usar para objetos solo de datos en TypeScript: clase o interfaz?
Tengo un montón de "clases" solo de datos (en el mundo .NET las llamamos objetos POCO) que no tienen ningún método ni siquiera constructores. Los ejemplos son entidades como Cliente, Producto, Usuario, y así sucesivamente...
Originalmente comencé a usar clases de TypeScript, pero ahora estoy pensando que declararlas como interfaz podría ser mejor. Desde el punto de vista del rendimiento, y no solo... Es solo que en C# estamos acostumbrados a usar interfaces para cosas diferentes, y para "POCO" (Plain-old-clr-object, u objeto "solo de datos") usamos solo una clase (a veces incluso struct).
¿Cuál es una manera adecuada de declararlos en TypeScript?
Tenga en cuenta que principalmente entiendo (creo) las diferencias técnicas entre clase e interfaz (es decir, que la interfaz es una construcción en tiempo de compilación), pero estoy tratando de averiguar cuál se ajusta a este caso semánticamente.
P.D.: He visto preguntas similares (como esta) pero ninguna de ellas aborda este problema específico de manera clara y definitiva, así que por favor no cierren esto como 'posible duplicado' o 'basado en opiniones' (porque no lo es) :)
Respuesta #1
Usa interfaz, la clase ni siquiera se acerca.
La gente empieza a escribir TypeScript y de repente piensa que tienen que usar clases por alguna razón. Pero no es así. Las clases son una característica de ES6 y funcionan bien, pero si es solo datos, es solo datos.
Un gran problema con el uso de clases es que no se serializan/deserializan como esperas a través de la red, por lo que cosas como las comprobaciones instanceof no funcionarán.
Una regla general es que si no hay estado interno asociado con algunos métodos, y no hay necesidad de polimorfismo OO tradicional, no uses una clase. Esto incluso se extiende a las clases estáticas: usa namespace/módulo en su lugar.
Respuesta #2
Usa clases con propiedades de parámetro:
// Immutable data object
class Person {
constructor(readonly firstName: String, readonly lastName: String) {}
}
// Mutable data object
class Person {
constructor(public firstName: String, public lastName: String) {}
}
