No entiendo por qué Typescript no resalta esto como un error...
Cuando agrego condicionalmente a un objeto una nueva propiedad que no existe en esa definición de tipo de objeto, Typescript la asigna
type Filters = {
keywords: Array<string>
}
const condition = 1;
let filters: Filters = {keywords: ['keyword']}
filters = {
...filters,
...(condition && {...{ tags: ['tag']}}),
}
Resultados:
filters: {
keywords:["keyword"]
tags:["tag"]
}
Mientras esperaba obtener este error:
Object literal may only specify known properties, and 'tags' does not exist in type 'Filters'.
PD: obtengo el error esperado cuando intento agregar la misma propiedad de esta manera:
filters = {...filters, tags: ['tag']}
Actualmente, esta es una característica que falta en TypeScript; las verificaciones de propiedades excesivas solo ocurren en ciertos contextos, y hasta ahora nadie ha implementado el tipo de verificación contextual de los contenidos de los objetos en línea que se distribuyen en los objetos externos.
Hay una solicitud de función abierta para esto en microsoft/TypeScript#39998 . Actualmente está marcado como "Esperando más comentarios", por lo que es posible que desee ir a ese problema, darle un 👍 y describir en un comentario su caso de uso y por qué es convincente. Dudo que tomar tal acción tuviera mucho efecto, pero no dolería.
Hasta donde yo sé, no hay una gran solución para darle este comportamiento. Si desea utilizar una función auxiliar como
const noExcess = <T extends object>() =>
<U extends { [K in keyof U]: K extends keyof T ? T[K] : never }>(u: U) => u;
Y especializarlo para Filters :
const noExcessFilters = noExcess<Filters>();
Y luego llámalo:
const z = noExcessFilters({
...filters,
...(condition && { tags: ['tag'] }),
}); // error! Types of property 'tags' are incompatible.
marcará situaciones como esta, pero no sé si te vale la pena.