npm i typescript -D
tsc --init
{
"compilerOptions": {
"allowJs": true,
"target": "ES5",
"outDir": "./dist",
"moduleResolution": "Node",
"lib": ["ES2015", "DOM", "DOM.Iterable"]
},
"include": ["./**/*"],
"exclude": ["node_modules"]
}
모든 js 파일을 ts로 변경하는 것보다 중요한 파일부터 점진적으로 바꾸는 것이 좋다고 한다. app.js를 app.ts로 변경한 후 발생한 에러부터 처리해보자.

jwt라는 상수가 전역적으로 선언되어 있는데 다른 파일에서도 선언되어 있기 때문에 발생하는 에러다. 다른 파일 어디에 redeclare되어 있는지 위치까지 친절하게 알려준다.
lib에 "ES2015" 포함이미 내 tsconfig 파일은 해당 옵션을 포함하고 있는데도 에러가 발생했다.
jwt를 jwt1 이런 식으로 변경해주니 에러가 발생하지 않는다.
export {} 추가export {} 구문을 쓰면 타입스크립트한테 es 모듈임을 알려준다. 파일을 모듈로 분리해주는 기능 같은데 우선 이걸로 채택했다.

app.use((req, res, next) => {
const error = new Error(`${req.method} ${req.url} 라우터가 없습니다.`);
error.status = 405; // error
next(error);
});
error.status = 405 부분에서 에러가 발생한다.
error는 Error 객체를 저장한 상수다. Error 객체에 status라는 속성을 추가해서 405 에러 처리를 해주는 코드다.
문제는 타입스크립트로 변환 시 Error 객체의 타입 선언 문서(lib.es5.d.ts)를 보면 프로퍼티에 status가 없어서 Property 'status' does not exist on type 'Error'(= Error 타입에 status 속성이 없습니다)가 발생한다.
기존의 Error 인터페이스로부터 상속 받는 ResponseError라는 새로운 인터페이스를 만들었다.
interface ResponseError extends Error {
status?: number;
}
const error의 타입을 ResponseError로 명시해주면 error.status의 에러가 사라진다.
app.use((req, res, next) => {
const error: ResponseError = new Error(`${req.method} ${req.url} 라우터가 없습니다.`);
error.status = 405; // 통과
next(error);
});
Error 객체가 아닌 res 객체에서 status 코드를 전달하도록 변경한다.
app.use((req, res, next) => {
const error = new Error(`${req.method} ${req.url} 라우터가 없습니다.`);
res.status(404); // 통과
next(error);
});