const SORT_VALUES = { a: -1, b: 1, } as const type sortWrapperReturn = -1 | 1 | 0 export const sortWrapper = <T extends string, SequenceItem = T>({ a, b, sequence, }: { a: T b: T sequence?: SequenceItem[] }): sortWrapperReturn => { if (a === b) return 0 if (sequence) { const aIndex = sequence.indexOf(a) const bIndex = sequence.indexOf(b) if (aIndex === -1) return SORT_VALUES.b if (bIndex === -1) return SORT_VALUES.a if (aIndex > bIndex) return SORT_VALUES.b if (aIndex < bIndex) return SORT_VALUES.a } return 0 }Necesito heredar el segundo tipo genérico del primero para que el tipo de los parámetros 'a' y 'b' se infiera al parámetro 'secuencia'
a y b deben poder asignarse a SequenceItem .
SequenceItem = T no significa que T sea asignable a SequenceItem . Para solucionarlo, debe asegurarle a TypeScript que el argumento de la sequence es un conjunto de T . Considere este ejemplo:
const SORT_VALUES = { a: -1, b: 1, } as const type sortWrapperReturn = -1 | 1 | 0 export const sortWrapper = <T extends string>({ a, b, sequence, }: { a: T b: T sequence?: T[] }): sortWrapperReturn => { if (a === b) return 0 if (sequence) { const aIndex = sequence.indexOf(a) const bIndex = sequence.indexOf(b) if (aIndex === -1) return SORT_VALUES.b if (bIndex === -1) return SORT_VALUES.a if (aIndex > bIndex) return SORT_VALUES.b if (aIndex < bIndex) return SORT_VALUES.a } return 0 } O bien, puede usar intersection con T[] :
export const sortWrapper = <T extends string, Sequence = T>({ a, b, sequence, }: { a: T b: T sequence?: Sequence[] & T[] // < ---- change }): sortWrapperReturn => { // ... code } sortWrapper({ a: 'a', b: 'b', sequence: ['a', 'b', 'c'] }) // ok