Inferred Type Predicates

TL;DR

Array.filterで型が絞り込まれるようになった。

const values = [1,2,3,null];

values
  .filter(v => v !== null)
  .reduce((a, b) => a + b);

// Previous: a is possibly null.
// Current: 

絞り込まれるパターン

values
  .filter(v => typeof v === "number")
  .reduce((a, b) => a + b);
values
  .filter(v => v !== null)
  .reduce((a, b) => a + b);
values
  .filter(v => isNumber(v))
  .reduce((a, b) => a + b);

const isNumber = (v: any): v is number => {
  return typeof v === "number";
};

絞り込まれないパターン

// assertion function
values
  .filter(v => isNumber(v))
  .reduce((a, b) => a + b);

const isNumber = (v: any): asserts v is number => {
  return;
};
// 戻り値が真偽値ではない、0を除外
values
  .filter(v => !!v)
  .reduce((a, b) => a + b);
// パラメータの変更
values
  .filter(v => {
    if (v === 2) { v = 20; }
    return v !== null;
  })
  .reduce((a, b) => a + b);
// 単一の戻り値ではない
values
  .filter(v => {
    if (v === null) { 
      return false;
    }
    return true;
  })
  .reduce((a, b) => a + b);

Last updated