Encontré un comportamiento extraño de TypeScript y me preguntaba cómo solucionarlo.
Tengo la siguiente función, que acepta un solo parámetro opts .
type Opts<E extends string | number> = { [P in E]?: string }; function setOpts(opts: Opts<O>): void { // does stuff with <opts> } La idea del tipo Opts<O> es que crea un tipo que acepta un objeto con claves de tipo O y valores de tipo string . Por ejemplo, si tengo un grupo de colores, digamos BLUE , RED y GREEN , obtendría lo siguiente:
let colors: Opts<'BLUE'|'RED'|'GREEN'> = { BLUE: 'Blue color', RED: 'Red color', GREEN: 'Green color' } Ahora, hasta aquí, todo funciona bien. Cuando llamo a mi función como se muestra a continuación, aparece un error mecanografiado, ya que YELLOW no es una clave aceptable. Eso es lo que espero y lo que quiero.
setOpts({ BLUE: 'b', RED: 'r', GREEN: 'g', YELLOW: 'y' })Sin embargo, por alguna razón (que no entiendo), cuando defino una constante con exactamente el mismo valor que el anterior y luego paso esa constante como un parámetro de mi función, TypeScript se compila sin error. Obviamente, no quiero eso.
const param = { BLUE: 'b', RED: 'r', GREEN: 'g', YELLOW: 'y' }; setOpts(param); ¿Me equivoco al suponer que TypeScript debería inferir un tipo para param . ¿Hay alguna manera de forzar tal comportamiento?