// Inside a container interface:
reduce<B = A>(op: (b: Widen<A, B>, a: Widen<A, B>) => Widen<A, B>): Widen<A, B>
// Callers:
list.reduce((a, b) => a + b) // B defaults to A, Widen<A,A> = A, fine
list.reduce<A | "extra">(...) // A extends A | "extra", Widen = B, fine
list.reduce<UnrelatedType>(...) // A doesn't extend Unrelated, Widen = never, compile error
The TypeScript equivalent of Scala's
B >: A(B is a supertype of A).Resolves to
BwhenA extends B(i.e., B is a legitimate supertype of A, or B = A). Resolves toneverotherwise, which renders any callback position using Widen uncallable — the user gets a compile-time error rather than a runtime type lie.