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);
});