niieani/typescript-vs-flowtype

conditional typing in Flow

Open

#37 opened on Jun 7, 2018

 (1 comment) (0 reactions) (0 assignees) (76 forks)github user discovery
help wanted

Repository metrics

Stars
 (1,728 stars)
PR merge metrics
 (No merged PRs in 30d)

Description

https://github.com/niieani/typescript-vs-flowtype#conditional-typing

You can the same, check this helper: https://gist.github.com/miyaokamarina/934887ac2aff863b9c73283acfb71cf0

type $If<X: boolean, Then, Else = empty> = $Call<
    & ((true, Then, Else) => Then)
    & ((false, Then, Else) => Else),
    X,
    Then,
    Else,
>;

type $Not<X: boolean> = $If<X, false, true>;
type $And<X: boolean, Y: boolean> = $If<X, Y, false>;
type $Or<X: boolean, Y: boolean> = $If<X, true, Y>;

type $Gte<X, Y> = $Call<
    & ($Subtype<X> => true)
    & (mixed => false),
    Y,
>;

////

declare var a: $Gte<number, string>;

/* error  1 */ (a: true);
/* ok       */ (a: false);

declare var b: $Gte<number, number>;

/* ok       */ (b: true);
/* error  2 */ (b: false);

declare var c: $If<true, 1, 2>;

/* ok       */ (c: 1);
/* error  3 */ (c: 2);

declare var d: $If<false, 1, 2>;

/* error  4 */ (d: 1);
/* ok       */ (d: 2);

////

declare var e: $If<$Gte<number, string>, 1, 2>;

/* error  5 */ (e: 1);
/* ok       */ (e: 2);

declare var f: $If<$Gte<number, number>, 1, 2>;

/* ok       */ (f: 1);
/* error  6 */ (f: 2);

////

type IsNumber<X> = $Gte<number, X>;

type NumberTo12<X> = $If<IsNumber<X>, 1, 2>;

declare var g: NumberTo12<string>;

/* error  7 */ (g: 1);
/* ok       */ (g: 2);

declare var h: NumberTo12<number>;

/* ok       */ (h: 1);
/* error  8 */ (h: 2);

Contributor guide