Есть ли уловка, чтобы «оценить» тип генерика c fuction?
Рассмотрим следующее:
type Arr = <A>() => A[]
type Ev<G, A> = ???
Вопрос: Это можно заполнить ???
так, чтобы Ev<Arr, A>
равнялось () => A[]
? (По сравнению с <A>() => A[]
)
Еще несколько примеров желаемого поведения:
Ev<<A>() => A[], number>
// should evaluate to
// () => number[]
Ev<<A>() => string, number>
// should evaluate to
// () => string
Ev<<A>() => [string, A], { some: "thing" }>
// should evaluate to
// () => [string, { some: "thing" }]
Упрощенная версия вопроса будет такой: Можем ли мы определить
type EvNum<A> = ???
такой, что
EvNum<
<X>() => X
> // should be `number`
EvNum<
<X>() => X[]
> // should be `number[]`
EvNum<
<X>() => [X, "hi"]
> // should be `[number, "hi"]`
EvNum<
<X>() => SomeGenericType<X>
> // should be `SomeGenericType<number>`
EvNum<
<X>() => "constant"
> // should be `"constant"`