Quesstor
Quesstor

Reputation: 302

Typescript type can not be inferred if function parameter is used

Lets say i have this generic function:

const myFn = <T>(p: {
  a: (n: number) => T,
  b: (o: T) => void,
}) => {
  // ...
}

If i use myFn with no parameter for function a it works and the type of T can be inferred from the return type of a:

myFn({
  a: () => ({ n: 0 }), // Parameter of a is ignored
  b: o => { o.n }, // Works!
})

but if i want to use the parameter for function a suddenly the type of T can not be inferred:

myFn({
  a: i => ({ n: 0 }), // Parameter i is used
  b: o => { o.n }, // Error at o: Object is of type 'unknown'.ts(2571)
})

Can someone explain this behavior? How can i fix this such that the type of T can be inferred from the return type of a?

Upvotes: 1

Views: 263

Answers (1)

AFTER TypeScript 4.7

Just switch to TypeScript 4.7, see this

BEFORE TS 4.7

Extra generic for b should help:

const myFn = <T,>(p: {
  a: (n: number) => T,
  b: <U extends T /* EXTRA U generic */>(o: U) => void,
}) => {
  // ...
}


myFn({
  a: () => ({ n: 0 }), // Parameter of a is ignored
  b: o => { o.n }, // Works!
})

myFn({
  a: i => ({ n: 0 }), // Parameter i is used
  b: o => { o.n }, // Works 
})

This article should help to understand why your approach did not work

Upvotes: 1

Related Questions