typescript-vs-flowtype icon indicating copy to clipboard operation
typescript-vs-flowtype copied to clipboard

conditional typing in Flow

Open sibelius opened this issue 6 years ago • 1 comments

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);

sibelius avatar Jun 07 '18 17:06 sibelius

Cool stuff! Can you make a PR?

niieani avatar Jun 07 '18 18:06 niieani