Estoy tratando de resolver el problema con la función de matriz de filter en Typescript, código a continuación:
type Tag = string type Args = { tags?: Tag[] } const func = async (args: Args) => { if (args.tags) { const entities = [ { tagId: '1' }, { tagId: '2' } ]; const filtered = entities.filter(entity => args.tags.includes(entity.tagId)); const mapped = args.tags.map(tag => tag + '_test'); } }; Este código arroja el error TS2532: el objeto posiblemente no esté definido cuando intento filtrar la matriz de entities . Por alguna razón, el intérprete de TS cree que args.tags puede no estar definido, por lo que no se puede llamar a la función de include . Pero como puede ver, hay una verificación arriba, también la función de map funciona bien.
¿Qué puede estar mal aquí? Cualquier pensamiento es bienvenido.
Gracias.
TypeScript no sabe que la devolución de llamada de filter se ejecuta inmediatamente, por lo que si, por ejemplo, la devolución de llamada de filter se ejecutara más tarde (digamos en un setTimeout ), su código se bloquearía con una llamada como esta:
const a: Args = { tags: [] }; await func(a); a.tags = undefined; // Later, the callback runs and accesses 'includes' of the undefined we just set ¡Puedes usar !
entity => args.tags!.includes ... O esconder el valor en una const
const tags = args.tags; if (tags) { // ... const filtered = entities.filter(entity => tags.includes ...type Args = { tags?: Tag[] // this means --> tags: Tag[] | undefined } Use el encadenamiento opcional y la fusión nula dentro Array.filter() .
const filtered = entities.filter(entity => args?.tags?.includes(entity.tagId));