Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
TypeScript 6.0で非推奨化されるオプションたち
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
uhyo
November 23, 2025
Technology
8.4k
18
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
TypeScript 6.0で非推奨化されるオプションたち
2025-11-23 TSKaigi Hokuriku 2025
uhyo
November 23, 2025
More Decks by uhyo
See All by uhyo
Baseline対応のDOMの型定義を作った
uhyo
3
720
AIのReact習熟度を測る
uhyo
2
810
React、まだ楽しくて草
uhyo
7
4.6k
TypeScript 7.0の現在地と備え方
uhyo
6
3.5k
React 19時代のコンポーネント設計ベストプラクティス
uhyo
20
10k
型定義でAIと会話する:型を通じてAIに意図を伝えるテクニック
uhyo
1
95
タグ付きユニオン型を便利に使うテクニックとその注意点
uhyo
3
1.1k
ECMAScript仕様の最新動向: プロセスの変化と仕様のトレンド
uhyo
3
910
Claude Code 10連ガチャ
uhyo
4
1.1k
Other Decks in Technology
See All in Technology
最近評価が難しくなった
maroon8021
0
250
Zoom2Youtube.Claude
kawaguti
PRO
2
460
Docker Desktop不要の時代が来る? WSL標準の「wslc」で Linuxコンテナを動かしてみた.
ueponx
0
790
DMM.com 購入改善推進チーム におけるCodeRabbitを用いた レビューフロー改善の一例
ysknsid25
1
510
依頼文化をやめる日 EM視点で語るPlatform EngineeringとInclusive SRE / Discussing Platform Engineering and Inclusive SRE from an EM's Perspective
shin1988
4
3.9k
“ID沼入口” - 基本とセキュリティから始める、考え続けるためのID管理技術勉強会 告知&イントロ
ritou
0
440
Keeping applications secure by evolving OAuth 2.0 and OpenID Connect
ahus1
PRO
1
150
AI時代のエンジニアキャリアについて今一度考える
sakamoto_582
2
1.3k
プロダクトだけじゃない、社内プロセスにおける自動化・省力化ノススメ
kakehashi
PRO
1
2.4k
アカウントが増えてからでは遅い? ~ マルチアカウント統制の勘所 ~
kenichinakamura
0
190
証券システムを10年Scalaで作り続けるということ - 関数型まつり2026
krrrr38
3
730
ループエンジニアリングでE2Eテストを実践
noriyukitakei
0
300
Featured
See All Featured
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.3k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
320
The Pragmatic Product Professional
lauravandoore
37
7.4k
Why Our Code Smells
bkeepers
PRO
340
58k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
440
Joys of Absence: A Defence of Solitary Play
codingconduct
1
410
Rails Girls Zürich Keynote
gr2m
96
14k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
630
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
640
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
200
Transcript
TypeScript 6.0で非推奨化され るオプションたち 2025-11-23 TSKaigi Hokuriku
発表者紹介 uhyo 株式会社カオナビ フロントエンドエキスパート TypeScriptにtype宣言が無かったころから 使っている。 2
TypeScriptの最近の動き TypeScriptのネイティブ版(tsgo)の準備は 着々と進んでいる。 ネイティブ版はバージョン7.0としてリリース される見込み。 3
次のTypeScriptバージョン 7.0とは別に、次期バージョンとして6.0も準備 されている。 (現在の最新版は5.9) 6.0は、ネイティブ版に向けた準備のための バージョンという側面が大きく、機能追加などは 限定的。 4
次のTypeScriptバージョン 最新情報では、6.0は2026年1月~2月リリースを 目指しており、7.0はその約1か月後。 参考: https://github.com/microsoft/TypeScript/issues/62785 5
This Talk 6.0ではネイティブ版への準備として、 古いオプションの非推奨化が予定されている。 6.0で非推奨化されたオプションは、7.0では実装 されない(廃止)。 今回は、そんな将来廃止予定のオプションを 解説します。 6
でもその前に…… TypeScriptのバージョニング の歴史 7
大前提 TypeScriptはセマンティックバージョニング ではない。 5.0はなぜ5.0なのか? 4.9の次のバージョンだから。 8
大前提 「あ~TypeScript 5系が出たのか。 うちは4.9だから破壊的変更チェックしなきゃ」 → 違います。4.8→4.9と同じ感覚でアップデート していいです。 9
初期のX.0の扱い 初期では、X.0を「大きめの特別なリリース」とし て扱っていた。 2.0はstrictNullChecksなど大きな改善があり、 1.9を飛ばして1.8→2.0となった。 10
3.0以降は完全に普通のバージョン TypeScript 2.xの間に現在に近いリリースサイクル が確立。 リリースも定期的(3ヶ月に1回)になり、 X.0は単なる桁の繰り上がりでしかなくなった。 11
5.0: deprecationの登場 TypeScript 5.0は、deprecationサイクルの概念が 登場したリリース。 古いオプションの廃止が始まった。 サイクルの開始バージョンという若干の特別性。 参考: https://github.com/microsoft/TypeScript/issues/51000 12
5.0のdeprecationサイクル 5.0: 指定すると警告が発生。警告を無視するため にignoreDeprecationsを指定可能 5.5: 指定しても何も起きない(エラーにならないが、 オプションの効果はない) 6.0: 完全廃止(存在しないオプションを指定するとエ ラー)
13
そして6.0 6.0は、5.0のサイクルを完遂して次のサイクルが 始まるバージョン。 完遂は7.0となり、一応このサイクルに則って行う ことになっている。 (ただ、6.1~6.9を律儀に全部リリースするのかは不明。 しばらく6系もメンテするという情報はある) 14
本題: 6.0で非推奨化される オプションたち 15
なぜ非推奨化するのか もう需要がない古いオプションを非推奨化すると いう方針は変わらない。 さらに、ネイティブ版に移植するコードを減らす という意図もありそう。 参考: https://github.com/microsoft/TypeScript/issues/54500 16
ご注意 このトークの情報は、GitHubのissue等から得ら れる公式情報をもとにまとめています。 あくまで予定のため、実際のリリース時には内容 が変化する可能性があります。 17
①target: es5 •ES5へトランスパイルする機能の廃止 •型定義としての lib: [“es5”] は存続らしい •最小ターゲットはes2015に変更 18
target: es5 why? ES2015をサポートしていない環境はもうあまり 実用されていない。 どうしてもES5が必要なら他のツールもある。 19
ES5へのトランスパイルは大変 最近の構文に比べると、ES2015は大がかりな トランスパイルが必要になる機能が多め。 (最近でもusingとかはトランスパイルが大変だが……) 20
ES5へのトランスパイルは大変 トランスパイル前: function sum(nums: readonly number[]) { let sum =
0; for (const v of nums) { sum += v; } return sum; } 21
ES5へのトランスパイルは大変 トランスパイル後: function sum(nums) { var e_1, _a; var sum
= 0; try { for (var nums_1 = __values(nums), nums_1_1 = nums_1.next(); !nums_1_1.done; nums_1_1 = nums_1.next()) { var v = nums_1_1.value; sum += v; } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (nums_1_1 && !nums_1_1.done && (_a = nums_1.return)) _a.call(nums_1); } 22
ES5へのトランスパイルは大変 トランスパイル前: function* getMenuItems(user: User) { yield "Home"; yield "Search";
if (user.isAdmin) { yield "Admin"; } yield "Settings"; } 23
ES5へのトランスパイルは大変 トランスパイル後: function getMenuItems(user) { return __generator(this, function (_a) {
switch (_a.label) { case 0: return [4 /*yield*/, "Home"]; case 1: _a.sent(); return [4 /*yield*/, "Search"]; case 2: _a.sent(); if (!user.isAdmin) return [3 /*break*/, 4]; return [4 /*yield*/, "Admin"]; case 3: _a.sent(); _a.label = 4; case 4: return [4 /*yield*/, "Settings"]; case 5: _a.sent(); return [2 /*return*/]; } }); 24
target: es5に関連するオプション downlevelIteratorもあわせて非推奨化。 (ES5へのトランスパイル時の動作を指定する オプションのため) 25
targetの新しいデフォルト値 従来のデフォルト値もes5だったが、 リリース時点の最新版が新しいデフォルト値に。 (今リリースしたらes2025) ただし、tsc --initで作成されるtsconfig.jsonの初期状 態は”target”: “esnext”になっている。 26
domとdom.iterable lib target: es5の廃止に合わせ、libで指定される domとdom.iterableは実質的に統合される。 (dom.iterable: DOMの型定義のうち、 イテレータ関連のものを抜き出したもの) 27
②outFile •outDirではなくoutFileを指定すると、ファイル ごとに.jsを出力するのではなくプロジェクトの ファイルを1つに統合した.jsを出力する。 •原始的なバンドラみたいな機能 •CommonJSやESMとは組み合わせられない 28
outFile why? バンドラでいい。 CommonJSやESMと組み合わせられない時点で、 需要もあまり無い。 実装も削減できる。 29
③いくつかのmodule値 •module: amd, umd, systemjs •ES Modulesの記法をこれらのモジュールシステ ムに変換して出力する 引き続き指定できる値: none,
commonjs, es2015, es2020, es2022, esnext, node16, node18, node20, nodenext, preserve 30
いくつかのmodule値 why? TypeScriptの開発当初に比べてAMDやSystemJS 自体の需要が減少している。 変換先が減ることはやはり実装の削減に貢献。 31
④moduleResolution: classic •モジュール解決の方式を指定する。 •classicはCommonJSより前の何か 引き続き指定できる値: node10 (node), node16, nodenext, bundler
32
moduleResolution: classic why? npm文化となり、大体のランタイムがNode.jsと同様の モジュール解決をするようになった。 (“react” → ./node_modules/react のような基本ルール、 package.jsonのexports
フィールドのサポートなど) ただ、Node.jsのESMは拡張子が必要でNode.js 以外と異なるので、そちらに合わせたbundlerが 登場している。 33
⑤esModuleInterop, allowSyntheticDefaltImports •__esModuleに対応したemitをするオプション • ESMからトランスパイルされたCommonJSモジュー ルを示すマーカー •esModuleInterop: true の挙動に統一され、 オプションは廃止
34
esModuleInterop why? •__esModuleが十分にデファクトスタンダードに なったから •デメリット(余計なランタイムコード)の減少 • ネイティブESMの利用拡大 • TS側でmodule: nodenext等によるCJS/ESM
サポートの解像度が上がった 35
⑥alwaysStrict: false (?) •“use strict” と書かなくてもソースコードを常に strict modeとして扱うオプション •今はデフォルトfalseだが、“strict”: true
に含ま れるのでtrueにしているプロジェクトが多い (デフォルト値をtrueにするだけなのか、alwaysStrict オプション自体を消すのかははっきり決まっていないが、 多分オプションを消す) 36
alwaysStrict: false why? パフォーマンス上の理由が説明されている。 • falseだとパース時の先読みが必要なケースが増える • ASTのキャッシュを阻害する要因になる 元々Module形式のファイルでは全てstrict modeなので、
非strict modeの挙動は混乱の元になるという事情もあ るか。 37
オプションではないけど 非推奨化されるものたち 38
⑦一部のmodule構文 •namespaceは昔moduleという構文だった •その名残で今でもmoduleと書くことができたが、 ついに非推奨化 39 module Foo { export type
Bar = number; export const bar: Bar = 0; } namespace Foo { export type Bar = number; export const bar: Bar = 0; }
一部のmodule構文: 注意 引き続きmoduleを使う場面もある。 (アンビエントモジュール宣言) 40 declare module “my-foo-module” { type
Bar = number; const bar: Bar; }
一部のmodule構文 why? そもそもかなり昔にもうnamespaceに変えていた。 加えて、JavaScript側で似たようなmodule構文を 追加する機運がある。 その際TSの独自構文が邪魔にならないように、 独自構文は廃止したい。 41
⑧import … asserts •Import AssertionsとしてassertsがTypeScriptなど に実装された後、仕様がwithに変更された •assertsの使用は非推奨に 42 import json
from “./foo.json” asserts { type: “json” }; import json from “./foo.json” with { type: “json” };
import … asserts why? 仕様上非推奨になったとはいえ一度実装したもの なので互換性が大丈夫か危惧されていたが、 Google ChromeやNode.jsからも実装が削除され、 仕様からもassertsが消されることになり、 さすがに大丈夫そうなので削除される見通し。
43
もはや非推奨化でもないけど 挙動が変わるオプションたち 44
⑨typesのデフォルト挙動 • “types”: [“node”] のようにどの@typesパッケージを 自動で読み込むか決めるオプション •デフォルトでは「@typesパッケージ全て」 •新しいデフォルトは [] 45
typesのデフォルト挙動 why? 本当に全てを読み込む必要のあるプロジェクトは まず無い。大抵はnodeを読み込めば十分。 (あとはjestとか) 気付かないうちにパフォーマンスが落ちることを 防ぐためにデフォルトを変える。 46
typesのデフォルト挙動 補足 「型定義の無いパッケージの型定義を補う」系の @typesパッケージはそもそもtypesオプションで 指定する必要がない。(importすれば自動で読み込まれる) typesオプションで指定すべきなのは、主にグロー バル変数を生やす系。 47
⑩rootDirのデフォルト値 •プロジェクトのルートディレクトリを決めるオプ ション(outDirがどこからの相対パスになるか等に影響) •従来は「全てのソースファイルを内包するディレク トリ」 •新デフォルトは「tsconfig.jsonがあるディレクトリ」 48
rootDirのデフォルト値 why? 全てのソースファイルを列挙しないとrootDirが定まら ないのはパフォーマンスに悪影響だから。 ソースファイルの列挙はimportを辿ることも含むので わりと大変。 49
⑪tscにファイル名を渡したときの挙動 • tsc foo.ts のようにすると…… • 従来挙動: tsconfig.jsonを無視してデフォルト設定 で実行 •
新挙動: tsconfig.jsonがある場合はエラーが発生。 --ignoreConfig(仮)を指定すると従来挙動 50
tscにファイル名を渡したときの挙動 why? 従来挙動は分かりにくく、意図が不明瞭で需要も ない。 AIがtsc foo.tsを実行して大量のエラーを発生させて 混乱することが多すぎるので、この修正はとても ありがたい…… 51
⑫それ以外のオプション修正 •libReplacementのデフォルト値がtrue→falseに • better-typescript-libを使う人は設定が必要(宣伝) •noUncheckedSideEffectImportsのデフォルト 値がfalse→trueに 52
もはや非推奨化でもオプショ ンでもないけど挙動が変わる やつら 53
⑬enum merging •実は同じファイル内で同じenumを複数回定義す るとマージされた •使われていないので廃止 54 enum E { Foo
= 1 } enum E { Bar = 2 }
⑭複数namespace間での変数参照 •依然として複数のnamespace定義をマージする ことは可能 •しかし、他のnamespace定義内で定義された変 数を参照している場合の挙動が変わる 55
複数namespace間での変数参照: 例 namespace Tax { export const rate = 0.1;
} const rate = 0.05; namespace Tax { function applyTax(price: number) { return price * rate; } } 56 このrateは何を指す?
複数namespace間での変数参照: 例 namespace Tax { export const rate = 0.1;
} const rate = 0.05; namespace Tax { function applyTax(price: number) { return price * rate; } } 57 従来挙動: このrateを指す (別ファイルだとしても!)
複数namespace間での変数参照: 例 namespace Tax { export const rate = 0.1;
} const rate = 0.05; namespace Tax { function applyTax(price: number) { return price * rate; } } 58 新挙動: このrateを指す
複数namespace間での変数参照 why? 変数が暗黙のうちに他のnamespaceの変数を参照 できる仕様だと、namespaceの全ての定義箇所を 調べないと変数参照を解決できない。 しかも、非モジュールでは同じnamespace定義が 他のファイルにある可能性がある。 パフォーマンス的な問題が大きい。 59
まとめ 60
非推奨化や挙動変更の傾向 •実装の削減(需要が少なくなった機能) •パフォーマンス 特に、「全ファイル見ないと決まらない系」の挙動が 複数廃止されている。 並列処理の妨げになるからかも? 61
今後の流れ TypeScript 6.0がリリース予定の数ヶ月後には、 このような非推奨化が来ることが予想される。 しばらくは「6系」のメンテナンスを継続すると されており、今回の非推奨化は6.5まで猶予がある。 ただし、Go版の速さを享受したければより素早い 対応が必要。 62
まとめ 対応が必要とはいっても、そんなに激しい破壊的 変更はなく、あくまでもう必要がない機能の 非推奨化にとどまる。 この辺りは互換性を重視するMicrosoftらしい ですね。 63