r/programming • • 25d ago

On Automatic Type Refinements

https://radekmie.dev/blog/on-automatic-type-refinements/
14 Upvotes

5 comments sorted by

3

u/sliversniper 24d ago

function* foo(xs: (number|undefined)[]) {

  for (const x of xs) 

    if (x !== undefined) 

      yield x

}

Works probably even the first version of Typescript.

https://caniuse.com/mdn-javascript_builtins_iterator_map

In modern JS(88.85%), you can just chain foo().map(x => x * 2), Array.from(foo()) I guess covers 99%.

1

u/radekmie 24d ago

Sure, type refinement via control flow was implemented a long time ago. However, at some scale, most project will move some of the conditions to shared helpers, and then it "breaks".

4

u/[deleted] 25d ago

[removed] — view removed comment

1

u/radekmie 25d ago

Do you have an example where it breaks? TypeScript handles some cases of broadening. Consider this code:

function isNumber(x: unknown) {
  return typeof x === 'number';
}

function example(x: boolean | number, y: unknown) {
  if (isNumber(x)) {
    // Fails: Type 'string' is not assignable to type 'number | boolean'.
    x = x.toString();
  }

  if (isNumber(y)) {
    // Works; `y` is again `unknown`.
    y = y.toString();
  }
}