Skip to content

TypeScript: 残っている TypeScript 6(svelte-check と e16c のパーサ)を 7 に移す #35

Open

Description

@kurouna

現状

型検査そのものは TypeScript 7 に移っている。tsc は @typescript/native(npm:typescript@7.0.2)のもので、npm run typecheck の 4 つの tsconfig はすべて 7 で検査される。typescript 6.0.3 が残っているのは、JS の Compiler API が要る次の 2 か所のためだけ(decisions.md の TypeScript の行)。

1. svelte-check(typecheck:web)

  • svelte-check --tsgo は TS 7 で検査するが、起動には TS 6 と TS 7 の両方が要る。最新の 4.7.7 でも peer は typescript: ^5 || ^6 のまま。
  • TS 6 を外すと「TypeScript 7 support currently requires both TypeScript 7 and TypeScript 6 installed」で止まる。

2. e16c のパーサ(ELEC-16 の CODE・GAMES ▸ DEVELOP・gen:elec16)

  • import ts from 'typescript' は src/shared/e16c/front.ts(ts.* 32 か所)と src/shared/e16c/body.ts(180 か所)の 2 ファイル。使っているのは ts.createSourceFile、ts.SyntaxKind、ts.is* の型ガード、ts.getModifiers、ts.tokenToString、ts.NodeFlags、ts.ScriptTarget、それにノードの型。
  • これを読み込む場所:
    • CODE のコンパイル: src/renderer/widgets/elec16/code/compile.worker.ts(renderer の blob worker。パーサが入るので、worker のバンドルは約 3.7 MB)
    • PLAY のゲームキットのビルド: src/shared/elec16/kit/build.ts(同じ worker で動く)
    • BASIC と PLAY の ROM の生成: scripts/gen-elec16.mjs(e16c/basic-rom.ts、e16c/play-rom.ts。Node で動く)
  • テスト: tests/unit/e16c-fuzz.test.ts は ts.transpileModule で e16c のプログラムを JS にして TypeScript として走らせる。比べる 5 通りの 1 つ。

TypeScript 7.1 beta で試した結果(2026-10-24)

worktree で typescript と @typescript/native を両方 7.1.0-beta にした(確認だけで、commit はしていない)。

項目 結果
tsc -p で node / e2e / web / e16c e16c 以外のエラーは 0。7.1 の型検査の変更(distributive conditional が厳しくなったこと、生成された DOM の型)にはアプリのコードが通る
svelte-check --tsgo 起動しない(上の 1)
vitest 5611 件通過。e16c と ELEC-16 関連の 18 ファイルが ts.SyntaxKind が undefined で失敗する
npm run build 通る。ただし CODE の worker は実行時に動かない

7.1 の typescript パッケージの中身:

  • import ts from 'typescript'(.)は lib/version.cjs で、version と versionMajorMinor しか返さない。
  • API は typescript/sync、typescript/async、typescript/ast、typescript/ast/is、typescript/ast/factory などに分かれた。typescript/ast の SyntaxKind や is* は純粋な JS で、ブラウザでも動く。
  • パースは API#createSourceFile(typescript/sync)だけで、node:child_process で tsgo のネイティブバイナリを起動し、同期 RPC で呼ぶ。WASM 版は同梱されていない。そのため renderer の worker では使えない。transpileModule も同じ API を通る。

移行の条件

TS 6(typescript 6.x)を外し、typescript を 7 の 1 つにできるのは、次がすべてそろったとき:

  1. svelte-check が TS 7 だけで動く(peer に ^7 が入り、TS 6 なしで --tsgo か同等の方法が使える)。上流を待つ。
  2. e16c のパースがブラウザの worker でもできる。次のどれか:
    • TypeScript 7 がブラウザで動くパーサ(WASM 版など)を出す。それが出れば、front.ts と body.ts を typescript/ast と typescript/ast/is に書き換える。ノードの形や関数名が 6 と同じかは、そのとき確かめる。
    • e16c が別のパーサに移る(TypeScript の構文を読めて、ブラウザで動くもの)。e16c は TypeScript として型検査できることが前提(docs/elec16.md 6 章、tsconfig.e16c.json)なので、パーサは同じ構文を読めなければならない。大きな書き直しになる。
  3. e16c-fuzz の transpileModule の代わり。Node のテストなので、typescript/sync の API#transpileModule か、Vite / esbuild の変換に替えられる。
  4. 移したあと、gen:elec16 の出力(basic.s、rom.json、play-rom.json)がそのままであることを、テストが ROM をソースと照合して確かめる。

1 と 2 の前でもできること:

  • @typescript/native を 7.1 に上げる。上の結果どおり型検査は通る。ただし「ライブラリは最新の release に固定する」規則があるので、RC か正式版を待つ。
  • TS 7.1 が正式版になったら、svelte-check と、パースの API がブラウザで使えるかを確かめ直す。

関連

Activity

  1. kurouna commented on Oct 23, 2026

    @kurouna
    OwnerAuthor

    svelte-check の TypeScript 7 対応の状況(2026-10-24 に確認)

    移行の条件 1(svelte-check が TS 7 だけで動く)は予定に入っているが、手順の後ろのほうで、時期は決まっていない。

    メンテナの予定

    sveltejs/language-tools#3111(エディタで TS 7 を使えるようにする PR、open)で、メンテナが次の順番を書いている:

    1. #3111 を取り込む。
    2. svelte-check --tsgo-experimental-api を TypeScript 7.1 の安定版 API に合わせる(ほかの作業はこれを待つ)。
    3. その後のタスクの 1 つが「svelte-check が TypeScript 6 に頼らないようにする(svelte2tsx の更新)」。

    現状

    見通し

    TS 7.1 の正式版が出て、svelte-check がそれに合わせ、さらに svelte2tsx が TS 6 を使わなくなるまでは、TS 6 を外せない。早くても TS 7.1 の正式版より後になる。ブログでは RC が約 1 か月後、正式版はその少し後とされている。

    追う issue と PR: sveltejs/language-tools#2733(TypeScript Go 対応の親 issue)、#3111、#3149、#3063。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions