日付を表す文字列があるとして、可能ならばこれを Date オブジェクトに変換したい、というような時に使える関数です。

JavaScript 版

/** 引数を Date オブジェクトへ変換する。Date として解釈できなかった場合は引数をそのまま返す。 */
const tryParseToDate = (arg) => {
  if (arg instanceof Date) {
    return arg;
  }
  if (typeof arg !== 'string' && typeof arg !== 'number') {
    return arg;
  }
  const maybeDate = new Date(arg);
  const invalidDate = Number.isNaN(maybeDate.getTime());
  return invalidDate ? arg : maybeDate;
};

TypeScript 版

引数の型から Date 変換できないと判断できるものは先に弾くのか、それとも JavaScript 版のようにとりあえず全ての引数を受け付けるのか、どのように使いたいかにより、2パターンに分けられます。

引数の型をチェックするバージョン

const tryParseToDate = <T extends ConstructorParameters<typeof Date>[number]>(arg: T) => {
  const maybeDate = new Date(arg);
  const invalidDate = Number.isNaN(maybeDate.getTime());
  return invalidDate ? arg : maybeDate;
};

全ての引数を受け付けるバージョン

const tryParseToDate = <T>(arg: T) => {
  if (arg instanceof Date) {
    return arg;
  }
  if (typeof arg !== 'string' && typeof arg !== 'number') {
    return arg;
  }
  const maybeDate = new Date(arg);
  const invalidDate = Number.isNaN(maybeDate.getTime());
  return invalidDate ? arg : maybeDate;
};