{}const=>[]async()letfn</>var
開発Web

TypeScript 6: 新機能と変更が古いコードをどのように壊すか

このガイドでは、初心者向けに、実際のコード例を使用して、TypeScript 6.0のすべてのbreaking changesを分析します。具体的には、何が壊れるのか、なぜそれが起こるのか、そして5分でどのように修正するのかを説明します。

К

Kodik

著者

3分で読める

TypeScript 6.0は、いくつかの新機能を備えた単なるアップデートではありません。 移行リリースこれは、10倍の速度向上を実現する革新的なTypeScript 7.0の基盤を整えます。しかし、新しい機能とともに、既存のコードを壊す可能性のある変更が行われます。

TypeScript 6.0 が特別なリリースである理由

TypeScriptチームは、ネイティブコード(Go言語)へのコンパイラの完全な再書きに取り組んでおり、これにより7〜10倍のパフォーマンス向上が期待されます。ネイティブコンパイラを備えたTypeScript 7.0は2026年に予定されており、TypeScript 6.0は現在のバージョンと将来のバージョンとの橋渡し役を果たします。

これは、バージョン6.0で次のことを意味します。

  • 新しい言語機能が登場します

  • 一部の古い設定は廃止されます

  • 多くのオプションのデフォルトの動作が変更されます

  • 将来と対立する非常に古い機能が削除されます

🔥 10万人以上の学生が参加中

理論を読むのに疲れた?
コーディングの時間だ!

Kodik — 実践でプログラミングを学ぶアプリ。AIメンター、インタラクティブなレッスン、実際のプロジェクト。

🤖 AI 24時間
🎓 修了証
💰 無料
🚀 始める
今日参加

新しい主な機能: using を介したリソース管理。

TypeScript 6.0の最も顕著な新機能は、キーワードです。using ための リソースの明示的な管理 (Explicit Resource Management)これは、データベースへの接続を忘れる、イベントハンドラーをクリーンアップしない、メモリリークなど、開発者が最も頻繁に直面する問題の1つを解決します。

以前はどのように機能していましたか?

❌ 古い方法

async function fetchUserData(userId: string) {
    const db = await connectToDatabase();
    const cache = new RedisConnection();
    
    try {
        const user = await db.users.findById(userId);
        await cache.set(`user:${userId}`, user);
        return user;
    } finally {
        // 接続を閉じることを忘れないでください
        await db.close();
        await cache.close();
    }
}

問題: 特に関数からの出口が多い場合は、接続を閉じることを忘れがちです。

✅ usingを使用した新しい方法

async function fetchUserData(userId: string) {
    using db = await connectToDatabase();
    using cache = new RedisConnection();
    
    // 機能を終了すると自動的にクリアされます
    const user = await db.users.findById(userId);
    await cache.set(`user:${userId}`, user);
    return user;
    // dbとcacheはここで自動的に閉じられます
}

解決策: スコープを終了すると、リソースは自動的にクリアされます!

どこで役立ちますか?

🗄️ データベース接続: PostgreSQL、MongoDB、Redisは自動的に終了します

📁 ファイル操作: ファイルは読み取り/書き込み後に閉じられます

⚛️ Reactコンポーネント: サブスクリプションとリスナーの自動クリア

🔒 任意のクリーンアップ操作: 一時ファイル、ロック、トランザクション

タイプの出力が改善されました。

TypeScript 6.0は、コンテキストを理解し、型を出力するのがよりスマートになりました。これは特に以下の場合に顕著です。

  • Promisesとasync/await: コンパイラは非同期操作のチェーンをよりよく理解します

  • ジェネリック: TypeScriptは自動的に推測するため、明示的に型を指定する必要はほとんどありません

  • 条件付きタイプ: 複雑なシナリオでのより正確なタイプの定義

TypeScript 5.x

// タイプの明示的な指示を要求しました
const items = await Promise.all([
    fetch('/api/users').then(r => r.json() as User[]),
    fetch('/api/posts').then(r => r.json() as Post[])
]);

TypeScript 6.0

// タイプを自動的に表示します
const items = await Promise.all([
    fetch('/api/users').then(r => r.json()),
    fetch('/api/posts').then(r => r.json())
]);
// アイテムはすでに正しいタイプです!

Breaking Changes: コードで何が壊れますか?

そして、最も重要なことは、既存のコードを破壊する可能性のある変更です。それぞれを詳しく見ていきましょう。

1. --strict がデフォルトになります

変更点: 厳密な型チェックモードはデフォルトで有効になります。

これはどういう意味ですか?

  • strictNullChecks — 明示的な許可なしに null または undefined を割り当てることはできません

  • noImplicitAnyany の型を暗黙的に残すことはできません

  • strictFunctionTypes —より厳格な関数型チェック

❌ コードの破損方法:

// 以前は機能していた
function getUser(id: number) {
    return users.find(u => u.id === id); // ユーザーを返します|未定義
}

const user = getUser(1);
console.log(user.name); // TS 6.0 でエラーが発生しました!ユーザーが未定義の可能性があります

✅ TS 6.0 では正しくは次のとおりです。

const user = getUser(1);
if (user) {
    console.log(user.name); // OK
}
// または
console.log(user?.name); // OK, optional chaining

修正方法: null/undefinedにチェックを追加するか、オプションのチェーン(?.)を使用します。

2. 削除 --target es5

変更点: ES5ではコンパイルできません。最小値はES2015(ES6)です。

理由: ES5は2009年のJavaScriptです。最新のブラウザと Node.js は、長い間 ES6+ をサポートしています。ES5のサポートはコンパイラの速度を低下させます。

// tsconfig.json
{
    "compilerOptions": {
        "target": "es5" // ❌ TypeScript 6.0でエラーが発生しました!
    }
}
CODE_BLOCK_7__

修正方法:

  • target"es2015" 以降に変更してください

  • 古いブラウザのサポートが必要な場合は、TypeScriptの後にBabelを使用してトランスパイルします

3. --moduleResolution の変更

変更点: 古いモジュール解決戦略が古くなっています:

  • --moduleResolution node(またはnode10)—削除されます

  • 新しいおすすめ: bundler, node16, nodenext

⚠️ 注意: 拡張機能なしで相対パスを使用すると、インポートが機能しなくなる可能性があります。

以前は機能していた

// --moduleResolutionノード
import { helper } from './utils';

今必要なこと

// 拡張子を明示的に指定する
import { helper } from './utils.js';
// はい、.tsファイルでも.jsを使用できます!

💡 .tsファイルに.jsを使用する理由は何ですか?

TypeScriptはESモジュール標準に従い、インポートは最終的なJavaScriptと同じである必要があります。

修正方法:

  1. tsconfig.jsonのmoduleResolutionを変更します

  2. インポートに拡張機能を追加する

  3. または、より柔軟な"bundler"を使用してください

4. --baseUrlの削除

変更点: オプション --baseUrl は廃止予定で、削除されます。

古い方法

// tsconfig.json
{
    "compilerOptions": {
        "baseUrl": "./src" // ❌ 古い情報です!
    }
}

// インポートは次のように機能しました
import { Button } from 'components/Button';

新しい方法

// tsconfig.json
{
    "compilerOptions": {
        "paths": {
            "@components/*": ["./src/components/*"],
            "@utils/*": ["./src/utils/*"]
        }
    }
}

// インポートは次のようになります
import { Button } from '@components/Button';

5. デフォルト値の変更

変更点: デフォルトでは、types フィールドは、node_modules/@types からすべてのタイプを自動的に含める代わりに、空の配列 [] になります。

// 以前は自動的に機能していました
import * as express from 'express'; // タイプは自動的に取得されました
CODE_BLOCK_13__

💡 これが役に立つ理由:

多くのプロジェクトでは、何百もの未使用のタイプが偶然に含まれており、コンパイルが20〜50%遅くなっていました。

6. デフォルトの rootDir = tsconfig.json ディレクトリ

変更点: rootDir は、ファイル構造から自動的に計算されなくなりました。

// TS 6.0 以前: rootDir はソースから計算されました
// src/
//   app/
//     index.ts
//   utils/
//     helper.ts

// TS 6.0以降:rootDir = tsconfig.jsonのあるディレクトリ
// 明示的に指定する必要があります
{
    "compilerOptions": {
        "rootDir": "./src"
    }
}

7. キーワードassertsはサポートされなくなりました

BREAKING

変更点: キーワード asserts は実験的なものであり、JavaScript仕様から追加および削除されたため、現在は削除されています。

// ❌ これはもう機能しません
import json from './data.json' 
    asserts { type: 'json' };
CODE_BLOCK_16__

TypeScript 6.0 への移行に備える方法

ステップ1:tsconfig.jsonを確認する

古い設定を見つけます。

{
    "compilerOptions": {
        // ❌ 削除/置き換え
        "target": "es5",
        "moduleResolution": "node",
        "baseUrl": "./src",
        
        // ✅ 必要に応じて明示的に追加する
        "strict": false, // strict の有効化を延期したい場合
        "types": ["node", "jest"], // 明示的に指定する
        
        // ✅ 新しいおすすめ
        "target": "es2015",
        "moduleResolution": "bundler",
        "paths": {
            "@/*": ["./src/*"]
        }
    }
}

ステップ2:インポートを更新する

moduleResolution: "node16"または"nodenext"を使用している場合は、次の拡張機能を追加します。

// 変更前
import { helper } from './utils';

// 変更後
import { helper } from './utils.js';

ステップ3:徐々にstrictを有効にする

まだ完全なstrictモードの準備ができていない場合は、オプションを1つずつ有効にします。

{
    "compilerOptions": {
        "strict": false,
        "strictNullChecks": true, // まずはこちらから
        // その後、残りのものを準備ができたら追加します
        // "noImplicitAny": true,
        // "strictFunctionTypes": true,
    }
}

ステップ4:TypeScript 5.9でテストする

TypeScript 5.9は、6.0で旧式になるという警告をすでに表示しています。準備に使用してください。

npm install -D typescript@5.9

パフォーマンス:なぜこれが重要なのか

速度の主な向上はTypeScript 7.0で実現されますが、6.0ではすでに最適化が行われています。

中間タイプのキャッシュ: 複雑なライブラリ(Zod、tRPC)を使用する場合、コンパイルが高速化されます

📦 チェックされるファイルが少なくなります。 デフォルトの types の変更による

🚀 より効率的なモジュール解決: 新しい戦略はより速く

TypeScript 7.0(6.0以降にリリース)では:

  • コンパイルがより速い 10回

  • メモリ使用量が 2 回

  • エディターでのプロジェクトの読み込み 9.6秒から1.2秒まで

結論

TypeScript 6.0は、言語の進化における重要なステップです。はい、それは破壊的な変更をもたらしますが、それらはすべて以下を目的としています。

  • 🛡️ コードのセキュリティを強化する(strictを介して)

  • ⚡ パフォーマンスの向上(最適化とTS7.0への準備による)

  • 🎯 現代の基準への適合(モジュール式システムの更新による)

キーワードusingは、リソース管理の実際の問題を解決します。型の推論が改善され、コードがよりクリーンになります。そして、TypeScript 7.0の準備は、革命的な速度の向上を約束します。

はい、移行には労力がかかります。特に大規模なプロジェクトの場合はそうです。しかし、その結果はそれだけの価値があります。より安全で、より速く、よりモダンなコードです。

これらの内容は、 コディケ!

私たちは、基礎から高度な概念まで、すべてを詳細に分析し、実践的なタスクで知識を強化します。

もし助けが必要な場合やコードについて話し合いたい場合は、 2000人の志を同じくする人々アクティブなTelegramチャンネル、いつでも助けてくれます! 🚀

🎯先延ばしをやめよう

記事は気に入った?
実践の時間だ!

Kodikでは読むだけでなく、すぐにコードを書く。理論 + 実践 = 本当のスキル。

即座に実践
🧠AIがコードを説明
🏆修了証

登録不要 • カード不要