I'm sure this is a dupe but for the life of me can't find it. I have a function interface that takes a type parameter:
interface A<T> {
(foo: T): void
}
And I want to assign an arrow function that satisfies that interface to a variable:
const x: A = <T>(foo: T) => { console.log(foo) };
But this of course fails to compile, because A requires the type parameter. This also fails:
const x: A<T> = <T>(foo: T) => { console.log(foo) };
because the type variable T
is not in scope on the LH of the assignment. How do I actually declare this?
CodePudding user response:
This is a generic type, which includes a function that uses the generic parameter:
interface A<T> { (foo: T): void }
This is a non generic type that includes a generic function:
interface A { <T>(foo: T): void }
You want this one.
The key here is that A
does not enforce any type for T
. That is done when the function is called, which is why it needs to to be on the function declaration, and not the interface or type alias.
And personally, I think this will be much clearer if you use type
instead of interface
.
type A = <T>(foo: T) => void