Last active
June 9, 2022 18:50
-
-
Save jfet97/23dc3a1065669c2b72d3142a0342eea1 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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