const arr=[{type:'a'},{type:'b'}] type TypeFromVal<T>=T extends {type:infer R}[]?R:any function GetType<T extends {type:string}[]>(arr:T,type:TypeFromVal<T>){ return arr.find(item=>item.type===type).type } GetType(arr,0)la inferencia automática es una cadena o un número, quiero obtener el tipo que es 'a' | 0 quiero que Typescript conozca el tipo de parámetro de la función que se infiere de arr. En otras palabras, ¿cómo obtener el tipo de inferir?
const arr = [{type: 'a'}, {type: 'b'}]; type TypeFromVal = { type: string | number } function GetType(arr: Array<TypeFromVal>, type: number | string) { return arr.find(item => item.type === type)?.type } console.log(GetType(arr, 0));Para inferir todos los tipos, debe usar as const para arr o pasarlo como un tipo literal para que funcione en lugar de pasar la referencia.
type FindIndex< T extends Array<{ type: string }>, ExpectedType extends T[number]['type'], > = { [Prop in keyof T]: (T[Prop] extends { type: infer Type } ? (Type extends ExpectedType ? Prop : never ) : never ) }[number]; { // 0 type Test = FindIndex<[{ type: 'a' }, { type: 'b' }], 'a'> } function GetType< Type extends string, Elem extends { type: Type }, Arr extends Elem[], ExpectedType extends Arr[number]['type'], >(arr: [...Arr], type: ExpectedType): FindIndex<Arr, ExpectedType> function GetType< Arr extends { type: string }[], ExpectedType extends Arr[number]['type'], >(arr: [...Arr], type: ExpectedType) { return arr.find((item) => item.type === type) } const result = GetType([{ type: 'a' }, { type: 'b' }], 'a') // 0Explicación
FindIndex : itera a través de una tupla/matriz inferida literalmente y comprueba si la propiedad de type amplía ExpectedType . En caso afirmativo, devuelva Prop , en nuestro caso, se trata de un índice. De lo contrario, never . Entonces, sin [number] al final, terminará con [0, never] . Indexarlo por [number] devuelve 0 | never , que es básicamente igual a 0 .
He sobrecargado GetType para aplicar FindIndex .
Además, como habrás notado, para inferir el tipo literal, debes inferir cada accesorio del elemento. Debes ir de abajo hacia arriba.
El primer Type genérico infiere la propiedad de type . Luego, Elem infiere cada elemento de la matriz. Y finalmente Arr , gracias a los tipos de tuplas variádicas, se infiere completamente.
Puede encontrar más información sobre las manipulaciones de tuplas en mi blog aquí y sobre la inferencia de tipos aquí