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);
intersection、union、difference、symmetricDifferenceや、関係を調べる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
特に確認する項目は次のとおりです。
filter後のarrayへ除外済みの値を追加していないか- regex literalに新しいerrorが出ないか
- Set methodsを対象runtimeがsupportするか
- libraryの
.d.ts差分が意図どおりか isolatedDeclarationsを有効にする目的があるか
型推論が狭くなった場所をas anyで戻さず、applicationが必要とする型をannotationで表現します。runtime APIの追加はcompatibility testを行います。