컴파일·로더·선언의 세 증거를 함께 본다

TypeScript 통과가 Node 실행을 보장하지 않는다. 세 결과물을 대조한다.

1 · emit

생성된 JavaScript

require("pkg") import x from "pkg"

module 모드가 남긴 로더 문법을 본다.

2 · loader

Node의 파일 판정

package.json "type" .mts / .cts / .mjs / .cjs

Node가 출력 파일을 어느 형식으로 읽는지 본다.

3 · types

선언이 보는 export

named / default / export = @types · package types

선언이 낙관적이면 검사만 통과할 수 있다.

TS✓ · JS✕ 선언과 실제 module.exports가 다르다. types ↔ runtime 비교
CJS / ESM require 출력과 ESM loader가 충돌한다. emit ↔ loader 비교
default 없음 default 합성과 실제 export가 일치하지 않는다. interop ↔ export 비교

환경부터 선택 Node는 node16/nodenext 계열, 번들러는 preserve/esnextbundler 해석을 맞춘다.