Recientemente vi un tutorial sobre Angular 2 con TypeScript, pero no estoy seguro de cuándo usar una interfaz y cuándo usar un modelo para contener estructuras de datos.
Ejemplo de interfaz:
export interface IProduct {
ProductNumber: number;
ProductName: string;
ProductDescription: string;
}
Ejemplo de modelo:
export class Product {
constructor(
public ProductNumber: number,
public ProductName: string,
public ProductDescription: string
){}
}
Quiero cargar datos JSON desde una URL y enlazar a la interfaz / modelo. En algún momento quiero un solo objeto de datos, otras veces quiero mantener una matriz del objeto.
¿Cuál debo usar y por qué?
angular
typescript
I_LIKE_FOO
fuente
fuente
Respuestas:
Las interfaces son solo en tiempo de compilación. Esto solo le permite comprobar que los datos esperados recibidos siguen una estructura particular. Para esto, puede transmitir su contenido a esta interfaz:
Ver estas preguntas:
Puede hacer algo similar con la clase, pero las principales diferencias con la clase son que están presentes en el tiempo de ejecución (función del constructor) y puede definir métodos en ellas con el procesamiento. Pero, en este caso, debe crear instancias de objetos para poder usarlos:
fuente
var data = res.json();
es realmentevar data: any = res.json();
para el compilador, así que perdemos todo tipo de verificacióndata
. Lo que sería más útil aquí sería algo así comovar data: ProductDto[] = res.json();
laProductDto
de ser una interfaz que los modelos de la estructura de datos en el JSON devuelto.Angular style guide says not to use interfaces.Always use classes.
Ver angular.io/guide/styleguide#style-03-03los interfaz describe un contrato para una clase o un nuevo tipo . Es un elemento mecanografiado puro, por lo que no afecta a Javascript.
Un modelo, y es decir, una clase , es una función JS real que se está utilizando para generar nuevos objetos.
Elija un modelo, de lo contrario seguirá siendo JSON en su Javascript.
fuente
Como dijo @ThierryTemplier para recibir datos del servidor y también transmitir el modelo entre los componentes (para mantener la lista intellisense y cometer un error de tiempo de diseño), está bien usar la interfaz, pero creo que para enviar datos al servidor (DTO) es mejor usar la clase para tomar ventajas del mapeo automático DTO del modelo.
fuente
Use Class en lugar de Interface, que es lo que descubrí después de toda mi investigación.
¿Por qué? Una clase sola es menos código que una interfaz de clase más. (de todos modos, puede requerir una clase para el modelo de datos)
¿Por qué? Una clase puede actuar como una interfaz (use implementos en lugar de extensiones).
¿Por qué? Una clase de interfaz puede ser un token de búsqueda de proveedores en la inyección de dependencia angular.
de la Guía de estilo angular
Básicamente, una clase puede hacer todo, lo que hará una interfaz. Por lo tanto, es posible que nunca necesite usar una interfaz .
fuente