Skip to content

Instantly share code, notes, and snippets.

@jfet97
Last active June 9, 2022 18:50
Show Gist options
  • Save jfet97/23dc3a1065669c2b72d3142a0342eea1 to your computer and use it in GitHub Desktop.
Save jfet97/23dc3a1065669c2b72d3142a0342eea1 to your computer and use it in GitHub Desktop.
export type Extends<A, B, Y = unknown, N = never> =
[A] extends [never] // <- ottimizzo evitando la distribution, altrimenti nello step dopo farei tot A extends B identici
? N
: A extends B
? Y
: N
// type IsNever<A> = A extends never ? true : false risulta in never se A = never
// (entra in gioco la distribution, ma non c'è nulla da distribuire!)
//
// type IsNever<A> = [A] extends [never] ? true : false risulta in true se A = never, altrimenti false
//
//
// Extends<never, B, Y, N> = N => never può essere tranquillamente usato come fall-through type
// per indicare il fallimento di una type function F:
// * se F<...> ritorna never allora F<...> extends B ? true : false è true
// (qui non avviene distribuzione, F<...> non è naked) perché never è sottotipo di qualunque B, e ciò è fastidioso
// * Extends<F<...>, B, true, false> invece è false
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment