// @flow // https://flow.org/en/docs/types/unions/#toc-unions-refinements // flow can refine on the union. // and knows when the code is operating on a number here for eg. // works function toStringPrimitivesGood(value: number | boolean | string): string { // Error! if (typeof value === 'number') { return value.toLocaleString([], { maximumSignificantDigits: 3 }); // Works! } else if (typeof value === 'boolean') { return String(value); } else { return "foo"; } } // fails, with an abstruse error. but still! function toStringPrimitivesBad(value: number | boolean | string): string { // Error! if (typeof value === 'number') { return String(value); } else if (typeof value === 'boolean') { return value.toLocaleString([], { maximumSignificantDigits: 3 }); // Works! } else { return "foo"; } } toStringPrimitivesGood(12); toStringPrimitivesBad(true); ////////////////////////////////////// // Error: src/main.js:23 // 23: return value.toLocaleString([], { maximumSignificantDigits: 3 }); // Works! // ^^ unused function argument // 56: toLocaleString(): string; // ^^^^^^^^^^^^^^^^^^^^^^^^ function type expects no arguments. See lib: /private/tmp/flow/flowlib_32d44c1c/core.js:56 // // Error: src/main.js:23 // 23: return value.toLocaleString([], { maximumSignificantDigits: 3 }); // Works! // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ unused function argument // 56: toLocaleString(): string; // ^^^^^^^^^^^^^^^^^^^^^^^^ function type expects no arguments. See lib: /private/tmp/flow/flowlib_32d44c1c/core.js:56 // Found 2 errors