{
"compilerOptions": {
"skipLibCheck": true, // 타입정의파일의 타입검사 생략
"target": "esnext", // 컴파일 후 자바스크립트 버전을 지정
"module": "esnext", // 모듈시스템 설정
"outDir": "dist", // 컴파일된 자바스크립트 파일의 위치를 지정
"strict": false, // 엄격한 검사모드
"strictNullChecks": false, //엄격한 null 검사(상위옵션은 strict)
"moduleDetection": "force", // 각각의 파일을 어떤 모듈로 감지할것인지
"allowJs":true, // 자바스크립트파일 허용
"noImplicitAny": false, // 암시적 any 허용여부 (true가 비허용, false가 허용)
},
"ts-node": {
"esm": true
},
"include": ["src"] // src경로 아래 모든파일을 포함해서 한번에 컴파일, tsc
}
자바스크립트는 각각의 파일이 개별모듈로 취급받기 때문에 파일별로 동일한 변수를 선언해도 오류가 나지않는다. 하지만 타입스크립트에서는 모든 타입스크립트 파일을 전역모듈로 보기때문에 다른파일에서 동일한 변수를 선언했을때 에러가 발생하게 된다.

해결방법은 ts파일 내에 모듈시스템을 사용하는 문법키워드를 한번이상 작성하는건데 타입스크립트는 tsconfig내 "moduleDetection": "force” 옵션으로 관리할 수 있다. moduleDetection을 force로 지정하고 컴파일하면 모든 js 파일에 export{} 가 추가되어있는걸 볼수잇다

손수 개별모듈로 지정하는방법

"moduleDetection": "force” 설정 후 컴파일된 js파일
node.js에서 es-module시스템을 사용하려면 package.json에 type module을 설정해줘야 사용가능하다.
// package.json
"type": "module",
ts-node는 기본적으로 common.js를 사용하기 때문에 es-module시스템을 이해하지 못한다. 따라서 tsconfig.json 아래와 같은 옵션을 설정하여 사용해야한다.
// tsconfig.json
"ts-node": {
"esm":true
}
만약 어떤 변수에 타입을 지정했을 경우 타입스크립트에서는 null이나 undefined 도 타입으로 보기때문에 넘버로 지정한 numA에게 null값을 넣어둘 수 없다.
하지만 "strictNullChecks": false, 옵션을 통해 이를 조절할 수 있는데 strinctNullChecks 옵션은 null타입이 아닌 변수에 null 값을 할당하는것을 허용할것인지 아닌지를 정한다.
상위옵션은 strict옵션으로 strictNullChecks를 따로 지정해주지 않으면 strict옵션에 따라 꺼지고, 켜지는게 정해진다.
let numA: number = null;