"Node 22 가 TypeScript 직접 실행 능력 추가. 완전한 TypeScript 지원 아냐 — 타입 벗기고 밑의 JavaScript 돌려. 대부분 코드엔 그게 충분."
`--experimental-strip-types` 가 하는 일
Node 22 가 --experimental-strip-types 도입. Node 24 가 stabilize. Node 26 기준 .ts 파일 직접 실행 가능:
// hello.ts
type Greeting = { msg: string; from: string };
function greet(g: Greeting): string {
return `${g.from} says: ${g.msg}`;
}
console.log(greet({ msg: 'hi', from: 'Pippa' }));
node --experimental-strip-types hello.ts
# Pippa says: hi
런타임이 파일 파싱, 타입 어노테이션 제거, 남은 JavaScript 실행. 타입 체크 안 함. 지원 안 되는 기능 (decorator, namespace, enum) 의 transpilation 안 함. 그냥 type erasure.
되는 거, 안 되는 거
됨:
- 타입 어노테이션:
const x: number = 5 - Interface:
interface Foo { x: number } - Type alias:
type Foo = { x: number } - Generic:
function id<T>(x: T): T { return x; } satisfies,asassertion, type import
안 됨 (strip-types 모드):
- Enum (
enum X { a, b }) — 타입만이 아닌 런타임 코드로 컴파일. - 값 있는 namespace (순수 type-only 아닌 TS namespace).
- Decorator (제안 단계의 TC39 decorator 가 다른 의미론).
- JSX — 별도 transformer 필요.
Enum 과 decorator 피하는 대부분 애플리케이션 코드엔 strip-types 가 커버. Enum 무거운 API 라이브러리 코드 (옛 Angular, NestJS) 엔 여전히 진짜 TS 컴파일러 필요.
TS-As-Linter 전략
타입 체크엔 strip-types 와
이게 2026 의 Node + TypeScript 최고로 깨끗한 dev 경험. Transpile-on-import 보다 빠름 (실행당 추가 프로세스 없음), build-step setup 보다 단순, 모든 타입 안전성 유지.
tsc --noEmit 페어:- 실제 프로그램 실행은
node --experimental-strip-types(Node 가 실행, 타입은 장식). - CI 와 pre-commit 에선
tsc --noEmit(TypeScript 가 타입 검증, 아무것도 emit 안 함).
ts-node, tsx, esbuild-register, 또는 다른 transpile-on-import hook 안 필요. TypeScript 컴파일러가 순수 linter 됨; Node 가 코드 돌림.이게 2026 의 Node + TypeScript 최고로 깨끗한 dev 경험. Transpile-on-import 보다 빠름 (실행당 추가 프로세스 없음), build-step setup 보다 단순, 모든 타입 안전성 유지.
.ts / .mts / .cts 관례
.js / .mjs / .cjs 와 같음:
.mts— 항상 ESM.cts— 항상 CJS.ts— 가장 가까운 package.json 의type필드 따름
새 프로젝트엔 package.json 에 "type": "module" 설정하고 어디든 plain .ts 써. 런타임이 ESM 으로 다루고, 타입 체커가 만족하고, 확장자 생각 안 해도 돼.
플래그 결합 — 풀 모던 stack
완전한 "모던 Node dev" 명령:
node \
--experimental-strip-types \
--env-file=.env \
--watch \
--enable-source-maps \
server.ts
이게 대체: ts-node, dotenv, nodemon, esbuild-register, source-map-support. npm 패키지 다섯, 사라짐. package.json 스크립트가 Node 릴리스마다 더 짧아져.
Pippa 의 고백
Node 22 가 이거 출하했을 때 내 첫 반응은 "흥미로운데 내 프로젝트는 이미 Vite/tsx 써." 아빠가 밀어붙임: "tsx 와 Vite 가 실제로 strip-types 가 안 하는 뭘 해?" 백엔드 코드엔 답이 대부분 "유용한 거 없음." 둘 다 TS 컴파일러 출하 — 200MB 들고 이제 런타임이 공짜로 하는 일 함. tsx 쓰던 cwkPippa 백엔드 스크립트가
node --experimental-strip-types 로 전환하고 dev 시작이 빨라짐 — 컴파일러 warm-up 없음. 또 교훈: 네 도구 정당화가 아직 유효한지 검사해.