ウェブサイト検索

TypeScript: ユニオン関数のパラメーター型ガード


色またはシリーズでウィジェットを検索したいです(少なくとも1つは必要です)。これはコンパイルされません:

export function widgets(params: {colorId: number} | {seriesId: number}) {
  if (params.colorId){
    // Search widgets by color
  } else {
    // Search widgets by series
  }
}

エラー: 型 '{ colorId: number; } | { seriesId: number; }' に 'colorId' プロパティは存在しません。

私はこれでうまくいくことができると知っています:

type ColorId = { colorId: number };
function isColorId(params: any): params is ColorId {
  return typeof params.colorId === "number";
}
export function widgets(params: { colorId: number } | { seriesId: number }) {
  if (isColorId(params)) {
    // Search widgets by color
  } else {
    // Search widgets by series
  }
}

私が探しているのは、よりボイラープレートの少ない解決策です。このためにもっとエレガントな方法があるように思えます。

回答 #1

この場合、型を絞り込む最も短い方法は、in 型ガードを使用することです:

export function widgets(params: {colorId: number} | {seriesId: number}) {
  if ('colorId' in params) {
    params.colorId
    // Search widgets by color
  } else {
    params.seriesId
    // Search widgets by series
  }
}

遊び場リンク