Estoy trabajando en una aplicación Angular. En eso tengo una interfaz IAbc :
interface IAbc { id: number, name: string } Y otra interfaz IXyz que usa la interfaz anterior como se muestra a continuación:
interface IXyz { id: number, value: string | number | Date | IAbc[]; }Aquí, el valor puede ser de cualquier tipo de datos, por lo que he reducido los tipos.
He creado una nueva variable:
let someVar: IXyz; someVar = { id: 100, value: [ { id: 1, name: 'abc' }, { id: 2, name: 'xyz' } ] }; Dado que el valor también puede ser una lista, tengo que usar forEach para realizar alguna operación:
someVar.value.forEach((x: IAbc) => console.log('some operation on value, ', x)) Pero me sale este error en forEach :
Property 'forEach' does not exist on type 'string | number | Date | IAbc[]'. Property 'forEach' does not exist on type 'string'.(2339)Creo que lógicamente esto debería funcionar. ¿Hay algo mal con el texto mecanografiado?
He creado un enlace de juegos, donde he reproducido esto.
Déjame saber lo que piensas. ¡Gracias!
PD: sé que puedo usar any allí y funcionará sin problemas, pero el uso de any ha sido deshabilitado por la pelusa de la aplicación.
Para deshacerse del error, puede usar un typeguard.
function isArray(value: string | number | Date | IAbc[]): value is IAbc[] { return (value as IAbc[]).forEach !== undefined; } if( isArray(someVar.value) ) { someVar.value.forEach((x: IAbc) => console.log('some operation on value, ', x)) }Puede verlo funcionando en una versión actualizada de su área de juegos aquí
Necesita un tipo de conversión para decirle al compilador que esto es de hecho una matriz
(someVar.value as IAbc[]).forEach((x: IAbc) => console.log('some operation on value, ', x))