TypeScript 5.5の新機能 - 型述語推論とisolatedDeclarations

7分 で読める | 2025.12.02

公式ドキュメント

TypeScript 5.5は2024年6月20日にreleaseされました。この記事は5.5固有の変更へ限定しています。5.4から順に更新する場合は、先に**TypeScript 5.4の記事**を確認してください。

推論されるType Predicate

記事情報: 2025年12月2日初出。TypeScript 5.5公式release記事を2026年7月25日に再確認しています。

5.5では、一定条件を満たすfunctionからtype predicateを推論できます。filter後のarrayがより具体的な型になります。

const values: Array<number | undefined> = [
  1,
  undefined,
  3,
];

const numbers = values.filter(
  (value) => value !== undefined,
);
// number[]

推論される主な条件は次のとおりです。

  • 明示的なreturn typeやpredicateを書いていない
  • returnが1つでimplicit returnがない
  • parameterを変更しない
  • parameterの絞り込みに結びつくboolean expressionを返す

predicateには「trueなら対象型、falseなら対象型ではない」という両方向の意味があります。truthiness checkは値域によって意図と異なる場合があります。

const scores: Array<number | undefined> = [0, 10, undefined];

const filtered = scores.filter((score) => !!score);

このfilterはruntimeで0も除外します。「undefinedだけを除く」ならscore !== undefinedと明示します。

推論が強くなったことで、以前は(T | undefined)[]だった変数がT[]になり、後からundefinedをpushするcodeがerrorになる場合があります。広い型を意図するなら変数へ明示annotationを付けます。

Constant Indexed Accessのnarrowing

objectとkeyが実質的に変更されない場合、obj[key]をtype checkの後で絞り込めます。

function uppercase(
  obj: Record<string, unknown>,
  key: string,
) {
  if (typeof obj[key] === "string") {
    return obj[key].toUpperCase();
  }

  return undefined;
}

objまたはkeyが再代入される場合は、同じpropertyを参照し続ける保証がないためnarrowingできません。errorをassertionで消すより、local constへ読み出して確認する方法もあります。

正規表現の構文検査

TypeScript 5.5はregex literalの基本的な構文errorをcompile時に検出します。

const valid = /user-(\d+)/;
const invalid = /user-(\d+/;
//                       ~ 構文error

括弧、backreference、escapeなどの誤りを早く見つけられます。ただしnew RegExp(userInput)のようにruntimeで組み立てる文字列の正しさや、patternのReDoS riskを保証する機能ではありません。

target ECMAScript versionによって利用可能なregex featureも異なります。compile成功だけでなく、対象browser・runtimeでtestします。

JSDoc @import

JavaScript fileをcheckJsで型checkするとき、runtime importを作らず型だけ参照する@import tagが追加されました。

/** @import { User } from "./types" */

/** @param {User} user */
export function displayName(user) {
  return user.name;
}

TypeScriptを直接書かないJavaScript projectや、JSDocで型を提供するpackageに役立ちます。これはJavaScript moduleのruntime importではありません。

新しいSet methodsの型

TypeScript 5.5はECMAScriptのSet methodsに型を追加しました。

const frontend = new Set(["React", "Svelte"]);
const typed = new Set(["TypeScript", "React"]);

const common = frontend.intersection(typed);
const all = frontend.union(typed);
const onlyFrontend = frontend.difference(typed);

intersectionuniondifferencesymmetricDifferenceや、関係を調べるmethodが対象です。

これらもTypeScriptがruntimeへpolyfillする機能ではありません。実行環境がsupportしない場合、compileは通ってもruntime errorになります。lib設定、target browser・Node.js、polyfillを確認します。

isolatedDeclarations

isolatedDeclarationsは、各source fileがほかのfileを型checkしなくてもdeclaration fileへ変換できる形かを検査するoptionです。declarationまたはcompositeも必要です。

{
  "compilerOptions": {
    "declaration": true,
    "isolatedDeclarations": true
  }
}

exportする値の型を、file単体で決められない場合にannotationを求めます。

export function add(left: number, right: number): number {
  return left + right;
}

このoption自体がdeclaration emitを高速化するわけではありません。ほかのtoolが並列・独立して.d.ts生成を実装しやすくする契約であり、5.5時点では対応toolとworkflowを別に確認する必要があります。

5.5 RC以降の注意

package.jsonを参照してmodule formatを判断する変更は、file watch負荷などのfeedbackを受けて5.5 finalで一時的にrevertされました。beta・RCの記事だけを基準にせず、final release noteを確認することが重要です。

minor version内でも修正が入るため、typescript@5.5の実際のpatch versionをlockfileで固定します。

移行手順

npm install --save-dev typescript@5.5
npx tsc --noEmit

特に確認する項目は次のとおりです。

  1. filter後のarrayへ除外済みの値を追加していないか
  2. regex literalに新しいerrorが出ないか
  3. Set methodsを対象runtimeがsupportするか
  4. libraryの.d.ts差分が意図どおりか
  5. isolatedDeclarationsを有効にする目的があるか

型推論が狭くなった場所をas anyで戻さず、applicationが必要とする型をannotationで表現します。runtime APIの追加はcompatibility testを行います。

参考リソース

← 一覧に戻る
PR
PR
PR
PR