Masalah Kompatibilitas dan Optimalisasi CI yang Perlu Diperhatikan Sebelum Beralih ke TypeScript 7
July 29, 2026
0
Computing/SoftwareComments (0)
Log in to leave a comment
No posts yet
Log in to leave a comment
No posts yet
TypeScript 7, yang ditulis ulang menggunakan Go, telah dirilis. Berita bahwa kecepatan pemeriksaan tipe (type checking) meningkat hingga 12 kali lipat tentu membuat tim yang mengelola monorepo skala besar ingin segera mengadopsinya. Faktanya, tim rekayasa di Vanta dan VS Code melaporkan bahwa mereka berhasil memangkas waktu build pada pipeline CI hingga lebih dari 80%.
Namun, menerapkannya secara gegabah dapat membuat seluruh CI rusak. Hal ini terjadi karena transisi ke native binary membuat dukungan untuk API analisis statis yang ada ditunda ke versi berikutnya. Alat-alat seperti @typescript-eslint atau ts-morph yang biasanya memeriksa API internal menggunakan require('typescript') akan berhenti berfungsi secara bersamaan. Performa yang ditawarkan memang sangat menarik, tetapi rantai alat (toolchain) yang rusak adalah masalah lain. Untuk mencegah terhentinya penyebaran (deployment) sambil tetap mendapatkan keuntungan kecepatan, diperlukan beberapa solusi alternatif (workaround).
Biner tsc pada TypeScript 7.0 memblokir pemanggilan modul internal Node.js secara total. Paket-paket yang biasanya diimpor dan digunakan dalam lingkungan JS akan langsung menghasilkan error pada saat build. Jika Anda langsung menaikkan versi tanpa persiapan, seluruh pipeline CI akan lumpuh.
Akan lebih aman jika Anda menempatkan skrip diagnosis di bagian paling atas pipeline. Pendekatan ini dilakukan dengan memindai semua package.json dan tsconfig.json di dalam workspace untuk menemukan opsi atau paket yang ditolak oleh TS 7. Jika konfigurasi versi lama seperti ignoreDeprecations atau target: es5 masih tersisa, skrip akan segera mengeluarkan error dan menghentikan proses.
`javascript
// scripts/check-ts7-compatibility.mjs
import fs from 'node:fs';
import { globSync } from 'glob';
const INCOMPATIBLE_DEPS = [
'ts-morph',
'ts-node',
'@babel/plugin-transform-typescript',
'typescript-eslint',
'@typescript-eslint/parser'
];
const DEPRECATED_TSCONFIG_OPTIONS = ['target:es5', 'moduleResolution:node', 'baseUrl', 'ignoreDeprecations'];
function runDiagnostics() {
console.log('TypeScript 7 호환성 사전 진단 시작...');
let hasError = false;
const packageFiles = globSync('/package.json', { ignore: '/node_modules/' });
for (const file of packageFiles) {
const content = JSON.parse(fs.readFileSync(file, 'utf8'));
const allDeps = { ...content.dependencies, ...content.devDependencies };
for (const dep of INCOMPATIBLE_DEPS) {
if (allDeps[dep]) {
console.warn([의존성 경고] ${file}: '${dep}' 패키지는 TS7 네이티브 API와 호환되지 않습니다.);
hasError = true;
}
}
}
const tsconfigFiles = globSync('/tsconfig*.json', { ignore: '/node_modules/' });
for (const file of tsconfigFiles) {
const rawContent = fs.readFileSync(file, 'utf8');
for (const opt of DEPRECATED_TSCONFIG_OPTIONS) {
if (rawContent.includes(opt)) {
console.error([설정 오류] ${file}: 무효화된 옵션 발견 -> '${opt}');
hasError = true;
}
}
}
if (hasError) process.exit(1);
}
runDiagnostics();
`
Transformer AST kustom yang bergantung pada ts.createProgram() atau ts.transform() juga tidak akan berfungsi. TS 7.0 tidak menerima injeksi plugin JS eksternal. Logika seperti ini harus diganti dengan modul binding Rust/C++ seperti SWC atau Babel, atau dipisahkan keluar dari tahap kompilasi.
| Opsi Kompilator | Perilaku TypeScript 6.0 | Perilaku TypeScript 7.0 | Solusi |
|---|---|---|---|
target |
Peringatan saat menggunakan es5 |
Hard Error (Kompilasi terhenti) | Ubah ke es2022 atau lebih tinggi |
moduleResolution |
Mengizinkan pengaturan node |
Hard Error | Ubah ke bundler atau node16 |
baseUrl |
Mengizinkan penggunaan mandiri | Hard Error | Beralih ke penggunaan mandiri compilerOptions.paths |
ignoreDeprecations |
Mengabaikan peringatan berfungsi | Opsi diabaikan & Error | Hapus konfigurasi tersebut sepenuhnya |
strict |
Default false |
Default true |
Atur nilai secara eksplisit di tsconfig.json |
TypeScript 7 memanfaatkan model threading dari Go. Versi ini menyediakan opsi baru --checkers untuk memproses pemeriksaan tipe secara paralel dan --builders untuk mengontrol build referensi proyek. Tim rekayasa Slack menggabungkan opsi ini untuk memangkas waktu type checking dari 20 menit menjadi 4,5 menit. Namun, jika jumlah thread diatur secara berlebihan dan tidak sesuai dengan jumlah core, overhead context switching CPU akan membengkak dan build akan gagal akibat OOM (Out of Memory).
Disarankan untuk menentukan jumlah thread sesuai dengan spesifikasi runner menggunakan rumus di bawah ini. Jika jumlah core yang dialokasikan pada mesin virtual adalah , total memori adalah , memori reservasi OS adalah (), dan rata-rata penggunaan memori per worker adalah (), maka jumlah thread optimal untuk proyek tunggal dapat dihitung sebagai berikut:
N_{checkers} = minleft( C_{vCPU}, leftlfloor rac{M_{total} - M_{OS}}{M_{worker}} ight floor ight)Total jumlah thread, yaitu , tidak boleh melebihi . Sebagai contoh, untuk lingkungan runner 8 vCPU / 16GB, pengaturan --checkers 4 dan --builders 2 adalah pilihan yang tepat.
`yaml}
name: Monorepo Parallel Typecheck
on:
push:
branches: [main]
jobs:
typecheck:
runs-on: ubuntu-latest-8-core
steps:
- name: Checkout Codebase
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 22
cache: 'pnpm'
- name: Install Dependencies
run: pnpm install --frozen-lockfile
- name: Purge Legacy TS 6.0 Cache
run: find . -name "*.tsbuildinfo" -not -path "*/node_modules/*" -delete
- name: Execute TS 7 Parallel Check
run: npx tsc --build --checkers 4 --builders 2 --verbose
`
Ada hal yang perlu diperhatikan. Mesin kompilasi inkremental pada TS 7 tidak cocok dengan format file cache .tsbuildinfo dari TS 6 sebelumnya. Jika Anda tidak menghapus cache versi lama menggunakan find . -name "*.tsbuildinfo" -delete sebelum build, segmentation fault dapat terjadi.
Language server untuk editor juga telah diperbarui berbasis biner Go LSP. Berdasarkan hasil pengujian AWS CodeBuild, waktu yang dibutuhkan sejak file dibuka hingga error tipe pertama muncul pada monorepo skala besar berkurang dari 17,5 detik menjadi 1,3 detik.
Untuk menyelaraskan lingkungan VS Code antar anggota tim, Anda cukup menambahkan konfigurasi berikut ke dalam .vscode/settings.json di root monorepo.
`json
{
"typescript.tsdk": "node_modules/typescript/lib",
"js/ts.experimental.useTsgo": true,
"typescript.enablePromptUseWorkspaceTsdk": true,
"typescript.preferences.preferTypeOnlyAutoImports": true,
"files.associations": {
"*.tsbuildinfo": "json"
}
}
`
Terkadang, bentrokan dengan plugin bahasa templat seperti Vue atau Svelte dapat terjadi sehingga analisis sintaksis terhenti. Jika hal ini terjadi, Anda dapat mengembalikannya ke mesin TS 6.0 lama melalui Command Palette (Ctrl+Shift+P) dengan memilih TypeScript: Select TypeScript Version... untuk melanjutkan pekerjaan.
Jika proyek Anda terikat dengan paket legacy sehingga ESLint tidak dapat langsung ditingkatkan ke lingkungan TS 7, Anda dapat mengakalinya dengan konfigurasi dual engine yang menggunakan dua kompilator secara bersamaan. Alat analisis statis dihubungkan ke API TS 6, sementara pemeriksaan tipe aktual dan build diserahkan ke native binary TS 7.
Tentukan alias paket (package alias) di package.json untuk menginstal kedua kompilator secara bersamaan.
`json
{
"name": "monorepo-root",
"private": true,
"devDependencies": {
"typescript": "npm:@typescript/typescript6@^6.0.2",
"@typescript/native": "npm:typescript@^7.0.2",
"eslint": "^9.0.0",
"typescript-eslint": "^8.0.0"
},
"scripts": {
"typecheck": "ts-native --build",
"typecheck:legacy": "tsc6 --noEmit",
"lint": "eslint ."
}
}
`
Dalam kondisi ini, menyisipkan skrip shadow build pada CI akan menjaga proses tetap aman. Anda dapat membandingkan hasil diagnosis TS 6 dan TS 7 menggunakan diff untuk memantau apakah ada perubahan hasil pada template literal type atau conditional type inference.
`bash
#!/usr/bin/env bash
set -e
echo "=== 1. 기존 TS 6.0 컴파일러 진단 출력 생성 ==="
npx tsc6 --noEmit --pretty false > ./ts6-baseline.log 2>&1 || true
echo "=== 2. 신규 TS 7.0 네이티브 컴파일러 진단 출력 생성 ==="
npx --package @typescript/native tsc --noEmit --pretty false > ./ts7-output.log 2>&1 || true
echo "=== 3. 진단 결과 Diff 대조 검증 ==="
DIFF_RESULT=$(diff ./ts6-baseline.log ./ts7-output.log || true)
if [ -z "DIFF_RESULT"
exit 0
fi
`
Hingga masalah kompatibilitas rantai alat terselesaikan, memisahkan peran linter dan typecheck adalah langkah yang lebih realistis. Dengan merapikan opsi yang berpotensi bermasalah menggunakan skrip diagnosis pra-pemeriksaan serta menyesuaikan thread dengan spesifikasi infrastruktur CI, Anda dapat menikmati peningkatan kecepatan tanpa mengalami kendala terhentinya pipeline deployment.