Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Type-level conditions in Flow https://is.gd/OPsJBd
// Licensed under CC BY 4.0.
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);
@mgtitimoli

This comment has been minimized.

Copy link

mgtitimoli commented Nov 5, 2018

Wonderful!

@zhirzh

This comment has been minimized.

Copy link

zhirzh commented Dec 30, 2018

what syntax is in L4-L5 and is it in the docs?

@piglovesyou

This comment has been minimized.

Copy link

piglovesyou commented Feb 2, 2019

Thanks to you @miyaokamarina, typing overloading of my library finally works out, thank you thank you!!!

@zhirzh, it's on https://flow.org/en/docs/types/intersections/#toc-intersection-type-syntax . A & B and & A & B are equivalent.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.