• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

타입스크립트 활용 질문

23.08.20 12:50 작성 23.08.20 12:53 수정 조회수 532

0

controllers/auth.ts의

 passport.authenticate("local", (authError, user, info) => { ...

부분에서 콜백함수의 매개변수들에 "매개 변수에는 암시적으로 'any' 형식이 포함됩니다.ts(7006)" 이런 에러가 발생해서

const callback: AuthenticateCallback  = (authError, user, info) => { ...

이렇게 분리해서 타입을 붙여줬고, 매개변수 에러는 없어졌지만 밑에

if (!user) {
      // 로직 실패 (유저가 없을 때)
      return res.redirect(`/?loginError=${info.message}`);
    }

여기에서 info에선 "(parameter) info: string | object | (string | undefined)[] | undefined

개체가 'undefined'인 것 같습니다.ts(2532)" 에러가 뜨고
message에선 "'string | object | (string | undefined)[]' 형식에 'message' 속성이 없습니다.
'string' 형식에 'message' 속성이 없습니다.ts(2339)"

에러가 떠서

if (!user) {
  // 로직 실패 (유저가 없을 때)
  const infoWithMessage = info as { message: string };
  return res.redirect(`/?loginError=${infoWithMessage.message}`);
}

이런식으로 타입에러 처리를 해줬습니다.

그런데 테스트 코드 짤 때 100%가 나왔다 하더라도 의미없는 테스트 코드를 짤 수 있다고 경고하신 것처럼 이것도 타입스크립트 에러 처리를 해도 타입스크립트를 제대로 활용해서 타입 명시를 한 것인지, 아니면 그냥 에러 지우기만을 위해서 꼼수를 부린 것인지 어떻게 판단해야 할 지 모르겠습니다. 위 경우에 제대로 사용한 것이 맞는지, 어떤 기준으로 제대로 TS를 사용했다 판단하는 것인지 궁금합니다.

 

 

답변 1

답변을 작성해보세요.

1

일단 타입스크립트에서 as를 써서 타이핑을 하는 건 거의 잘못이라고 보시면 됩니다. 타이핑을 했는데도 타입 에러가 나는 경우가 타입을 헛으로 붙인 대표적인 케이스고요. any 타입을 쓰거나 as를 통해서 하는 경우 제일 많이 발생합니다.

roider2316님의 프로필

roider2316

질문자

2023.08.20

그런데 위의 경우엔 info의 타입이 d.ts에선

info?: object | string | Array<string | undefined>,

이던데 이 상황에서 info.message를 꺼내 쓰려고 하면

'string | object | (string | undefined)[]' 형식에 'message' 속성이 없습니다.
'string' 형식에 'message' 속성이 없습니다.ts(2339)

에러가 뜨는데 이 상황에서 as말고 다른 방법이 있나요?

매개변수 info에 타이핑하면되죠

roider2316님의 프로필

roider2316

질문자

2023.08.20

 passport.authenticate("local", (authError: any, user:  Express.User | false | null, info: { message: string }) => {

이렇게 콜백함수 자체의 타입을 빼고 매개변수에 타입을 직접 넣어주는 식으로 에러를 해결했는데 이러면 아까 as붙인 것보다 괜찮나요?

 

괜찮다 정도가 아니라 그렇게 하셔야 합니다

roider2316님의 프로필

roider2316

질문자

2023.08.20

아 그렇군요. 감사합니다!!