Ya hemos visto que el uso de los interfaces en TypeScript nos sirve para forzar validaciones de tipos dentro de los elementos. Pero en este caso vamos a ver cómo podemos realizar validaciones menos estrictas en TypeScript que nos ayuden a aprovecharnos la flexibilidad que el lenguaje Javascript nos ofrece, pero sin perder la capacidad de las validaciones de tipo.
El realizar validaciones menos estrictas en TypeScript también puede valer para evitar ciertos errores en los nombres de las variables que hacen que el programa pueda fallar en ejecución.
En TypeScript tenemos tres formas de ejecutar validaciones menos estrictas:
- Index Signature
- Type Assertion
- Usando una variable intermedia
Index Signature
La idea es definir un índice genérico dentro del interface, en el que pueda valer cualquier tipo de variable. Para definir el índice genérico utilizamos la estructura:
[propName:tipo]: any
De esta manera podríamos definir el interface Cuadrado
de la siguiente forma:
interface Cuadrado {
lado: number;
color?: string;
[propName:string]: any;
}
E imaginemos que definimos una función que calcule el área:
function calcularAreaCuadrado(datos:Cuadrado): number {
let a = datos.lado*2;
return a;
}
En este caso nos da igual el resto de propiedades, es por ello que podríamos tener una definición de la siguiente forma, que no habría problemas de validación:
let a1 = calcularAreaCuadrado({lado:2,colour:'red'});
console.log(a1);
Vemos que el desarrollador ha cometido un fallo nombrando la propiedad color
y que la ha denominado colour
. No habría ningún problema ya que al tener el índice genérico forzamos unas validaciones menos estrictas en TypeScript y no daría error.
Type Assertion
El Type Assertion o forzado de tipo consiste en forzar el tipo de la variable cuando realizamos la llamada a la función. Esto hará que se obvien aquellos campos que no se cumplan en el interface.
En este caso nuestro interface es el siguiente:
interface Cuadrado {
lado: number;
color?: string;
}
Pero el punto de forzado es cuando llamamos al cálculo del área:
let a2 = calcularAreaCuadrado({radio:2,colour:'red'} as Cuadrado);
console.log(a2);
Vemos que utilizamos el operador as
para forzar el tipo de la variable y que sea un Cuadrado
que es el interface esperado por la función.
Usando una variable intermedia
En este tercer caso lo que haremos es simple y llanamente asignar el objeto a una variable intermedia antes de llamar a la función.
let c1 = {radio:2,colour:'red'};
let a3 = calcularAreaCuadrado(c1);
console.log(a3);
De esta forma habremos conseguido que no se realize la validación completa del interface.
De esta forma ya hemos visto las tres formas en las que podemos realizar validaciones menos estrictas en TypeScript.