😭

ts5.8正式リリース前の情報に踊らされていた話

に公開

結論

条件付き戻り値型に対するナローイングは、ts5.8 ではサポートされませんでしたが開発は続けられていてts5.9 でサポート予定のようです...

ゆっくり待ちましょう。

declare const record: Record<string, string[]>;
declare const array: string[];

function getObject<T extends string | undefined>(
  group: T
): T extends string
  ? string[]
  : T extends undefined
  ? Record<string, string[]>
  : never {
  if (group === undefined) {
    return record;
//  ^^^^^^
//  型 'Record<string, string[]>' を型 'T extends string ? string[] : T extends undefined ? Record<string, string[]> : never' に割り当てることはできません。
  }
  return array;
  //^^^^^^
  // 型 'string[]' を型 'T extends string ? string[] : T extends undefined ? Record<string, string[]> : never' に割り当てることはできません。
}

const arrayResult = getObject("group");
const recordResult = getObject(undefined);

5.8.0-dev.20241106 では一時的にサポートされていたので体験したい方は

npm install typescript@5.8.0-dev.20241106

などでバージョンを指定して試してみてください
このバージョンならサポートされていたという情報は以下の記事から得ています(手元の環境で確認済)
より新しい開発バージョンでもサポートされている可能性があります

https://bufferings.hatenablog.com/entry/2024/11/11/232139

記事作成のモチベ

以前も似たような関数を作る必要がありました。
その際調べたところ 5.8 ではできるようになるという情報があり、最新のバージョンはすでに 5.8 だったので試してみたが、できませんでした。
結局実装を見直すことで条件付き戻り値型に対するナローイングの必要性を回避して問題を先延ばしにしたのだが、今日再びその必要性が出てきたため良く調べたところ、できないとのことでした。
出来そうな雰囲気を醸し出す記事を書く人はたくさんいるが、できないという記事を作成する人はなかなかいないため、のようにあまりよく調べない層は 5.8 正式リリース前の情報に踊らされがちです。
そのような層に届くようにと思い、記事を作成しています。

分かったこと

https://devblogs.microsoft.com/typescript/announcing-typescript-5-8/#what’s-new-since-the-beta-and-rc

公式リリースにある通り、5.9 に延期になったようです。
しかしながら直後に戻り値の分岐に関するセクションがあり、英語を読むのをさぼって早とちりしていた結果延期になったことに気付けないでいたようです...

github にも似たような質問がありました...

学び

  • 新バージョンのリリース情報はよく読もう
  • リリース日と記事の書かれた日を比べよう
    • 正式リリース時の修正点を、ベータ版に基づいて書かれた記事が言及してくれていることはあまりない

Discussion