Purpose of `[]` in TypeScript type signatures
I'm looking at the Effect source and I see something unusual in the type signatures:
What's the purpose of the
declare const tap: {
<A, X>(
f: (a: NoInfer<A>) => X
): <E, R>(
self: Effect<A, E, R>
) => [X] extends [Effect<infer _A1, infer E1, infer R1>] ? Effect<A, E | E1, R | R1>
: [X] extends [PromiseLike<infer _A1>] ? Effect<A, E | Cause.UnknownException, R>
: Effect<A, E, R>
<X>(
f: NotFunction<X>
): <A, E, R>(
self: Effect<A, E, R>
) => [X] extends [Effect<infer _A1, infer E1, infer R1>] ? Effect<A, E | E1, R | R1>
: [X] extends [PromiseLike<infer _A1>] ? Effect<A, E | Cause.UnknownException, R>
: Effect<A, E, R>
<A, E, R, X>(
self: Effect<A, E, R>,
f: (a: NoInfer<A>) => X
): [X] extends [Effect<infer _A1, infer E1, infer R1>] ? Effect<A, E | E1, R | R1>
: [X] extends [PromiseLike<infer _A1>] ? Effect<A, E | Cause.UnknownException, R>
: Effect<A, E, R>
<A, E, R, X>(
self: Effect<A, E, R>,
f: NotFunction<X>
): [X] extends [Effect<infer _A1, infer E1, infer R1>] ? Effect<A, E | E1, R | R1>
: [X] extends [PromiseLike<infer _A1>] ? Effect<A, E | Cause.UnknownException, R>
: Effect<A, E, R>
}declare const tap: {
<A, X>(
f: (a: NoInfer<A>) => X
): <E, R>(
self: Effect<A, E, R>
) => [X] extends [Effect<infer _A1, infer E1, infer R1>] ? Effect<A, E | E1, R | R1>
: [X] extends [PromiseLike<infer _A1>] ? Effect<A, E | Cause.UnknownException, R>
: Effect<A, E, R>
<X>(
f: NotFunction<X>
): <A, E, R>(
self: Effect<A, E, R>
) => [X] extends [Effect<infer _A1, infer E1, infer R1>] ? Effect<A, E | E1, R | R1>
: [X] extends [PromiseLike<infer _A1>] ? Effect<A, E | Cause.UnknownException, R>
: Effect<A, E, R>
<A, E, R, X>(
self: Effect<A, E, R>,
f: (a: NoInfer<A>) => X
): [X] extends [Effect<infer _A1, infer E1, infer R1>] ? Effect<A, E | E1, R | R1>
: [X] extends [PromiseLike<infer _A1>] ? Effect<A, E | Cause.UnknownException, R>
: Effect<A, E, R>
<A, E, R, X>(
self: Effect<A, E, R>,
f: NotFunction<X>
): [X] extends [Effect<infer _A1, infer E1, infer R1>] ? Effect<A, E | E1, R | R1>
: [X] extends [PromiseLike<infer _A1>] ? Effect<A, E | Cause.UnknownException, R>
: Effect<A, E, R>
}[][]s in the return type? I'm talking about things like [X] extends [ ... ][X] extends [ ... ]. It compiles even without the [][]. Why are they there? Did I miss something?