error TS2339: Property 'id' does not exist on type 'User'.

 

express.js, passport.js, typescript 를 사용해서 로그인 기능을 구현했다.

passport local 로그인 동작 순서는 아래와 같다.

passport-local -> passport.authenticate -> local strategy -> req.login -> passport.serializeUser -> response


각 순서에서 작업을 수행하고 각 단계에서 callback 함수와 함께 다음 함수에서 필요한 값을 넘겨주게 된다.


 error TS2339: Property 'id' does not exist on type 'User'. 해당 에러는 아래 코드에서 발생되었다.

passport.serializeUser((user, done) => {
done(null, user.id);
});


아래 코드처럼 req.login으로 user 정보를 넘겨passport.serializeUser에서 해당 유저 정보를 받는데

return req.login(user, async (err) => {
if (err) {
console.error(err);
return next(err);
}

if (typeof user === 'object' && user !== null) {
if (user) {
return res.status(200).json({
success: true,
message: 'login success',
user: { email: user.email, nickname: user.nickname },
});
}
}
});

user 안에 id 값이 없다고 타입 에러가 발생했다.


일단 타입을 제대로 인식하지 못하는 문제를 해결하기 위해 아래와 같이 작성한다.

경로: src/types/index.d.ts

import { UserData } from '../entity/types';

declare global {
namespace Express {
export interface User extends UserData {}
}
}


User 데이터 타입에 내가 정의한 타입을 확장시켜준다. 

UserData 타입 내부에는 id: number, emai: string 등등..

정상적으로 동작하면 더이상 user.id에서 오류가 발생하면 안된다.


하지만.. 아래와 같이 계속 오류가 발생한다..


문제를 추측해봤다.


nodejs에 typescript를 같이 사용하고 CommonJS 모듈 방식이 아닌 ECMAScript 모듈 방식으로 코드를 작성하면서 typescript와 ts-node 라이브러리가 파일 경로를 정확히 인식하지 못하는 문제를 이전에 경험했다.

첫번째.

src/passport 경로에 passport 관련 코드를 작성하는 폴더에 index.ts 파일을 만들면 다른 파일에서 import passport from 'passport' 하는 경우에 passport 모듈을 import 하는게 아닌 내가 작성한 src/passport/index.ts 파일을 import 하는 오류가 발생했다.


두번째.

tsconfig.json 파일에 baseUrl을 ./src로 설정했음에도 src 폴더 내부에 작성한 다른 폴더에 접근할때 경로 인식 문제가있어서 폴더명/파일.ts 이렇게 절대 경로로 작성해도 정상적으로 import 해와야하지만 오류가 발생해 상대경로로 import 해야 하는 문제가 있었다.


위 경험을 토대로 경로 인식문제라 생각되어 찾아보니 비슷한 문제를 발견했다.

https://stackoverflow.com/questions/51610583/ts-node-ignores-d-ts-files-while-tsc-successfully-compiles-the-project


ts-node가 files, include, exclude 를 기본적으로 로드하지 않는다고 한다.

참고: https://github.com/TypeStrong/ts-node#missing-types


tsconfig.json에 설정을 추가하면 내가 확장한 타입이 제대로 인식되어 해결이 가능하다.




댓글