Есть ли какой-нибудь трюк, чтобы «оценить» тип общей функции?
Рассмотрим следующее:
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"`
<A>
на уровне типа. Мой вариант использования: общие типы для категории Клейсли монады без необходимости явно определять каждую категорию Клейсли вручную. Я хотел привести самый минимальный пример того, что мне нужно здесь. - person Gerrit Begher   schedule 30.03.2020Arr
(который является универсальным в типеEv
) должен быть параметризован другим универсальным, который, насколько я я знаю - это невозможно в Typescript. - person Xetera   schedule 31.03.2020type T = <A>(a: A) => number
не является универсальным типом, аinterface T<A>{ (a:A): number }
является универсальным типом. - person Gerrit Begher   schedule 25.04.2020