Issue
I have the following types defined:
type MyType = <T>(a: string, b: Record<string, MyFunction<T>>) => T
type MyFunction<T> = () => T
I want to create another type (MyType2) that takes the same parameters but returns void.
I don't wish to use the same type for both and have it return T | void because one function must return T and one must return void.
How can I achieve this with Typescript in a DRY way?
I'm convinced it's possible but I cannot figure it.
Solution
You can reuse the parameter types in a function using the Parameters helper and spread syntax:
type MyType2 = (...args: Parameters<MyType>) => void
Note that this results in a function type with an unknown instead of a generic function type with a type parameter:
(a: string, b: Record<string, MyFunction<unknown>>) => void
In this specific case that may not matter; I am not sure if there is a general way to do this which would output another generic function type with its own type parameter, but I suspect there is not, since Typescript does not support higher-kinded types. However, there is a way to make both functions generic without repeating too much code, by defining the parameters seperately as a generic tuple type:
type MyParameters<T> = [a: string, b: Record<string, MyFunction<T>>]
type MyType = <T>(...args: MyParameters<T>) => T
type MyType2 = <T>(...args: MyParameters<T>) => void
Answered By - kaya3
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.