0

Please explain why bar1 errors and not bar2 - why are these fundamentally different?

const foo1 = <E extends (a: unknown)=>void>(e:E)=>console.log(e)

const bar1 = <Arg extends unknown>()=>foo1((a:Arg)=>console.log(a))

const foo2 = <Arg extends unknown>(e:(a: Arg)=>void)=>console.log(e)

const bar2 = <Arg extends unknown>()=>foo2((a:Arg)=>console.log(a))

code

TrevTheDev
  • 2,616
  • 2
  • 18
  • 36

2 Answers2

1

foo1.E.a should be a superset or equal of unknown, but bar1.Args is a subset or equal of unknown

foo2.Args should be a subset or equal of unknown, and bar2.Args is a subset or equal of unknown.

Difference between Variance, Covariance, Contravariance and Bivariance in TypeScript

lei li
  • 1,244
  • 1
  • 12
  • 35
0

@lei li's answer is in a general sense the solution - however, a more specific solution is to change a to never as it's then "extendable".

const foo1 = <E extends (a: never)=>void>(e:E)=>console.log(e)

const bar1 = <Arg extends unknown>()=>foo1<(a: Arg)=>void>((a)=>console.log(a))
TrevTheDev
  • 2,616
  • 2
  • 18
  • 36