Type 'unknown' is not assignable to type 'IsignIn'

j_wisdom_h·2023년 12월 12일
0

Error

목록 보기
6/8

1. 에러 상황

next-auth로 로그인을 구현하던 중 발생한 에러

Type 'unknown' is not assignable to type 'IsignIn'

2. 에러 코드

import executeQuery from 'app/_lib/db'
import * as bcrypt from 'bcrypt'

import { IsignIn } from '@/_interfaces/IAuth'

export async function POST(request: Request) {
    const body: IsignIn = await request.json()
    const sql = `select email, password from bridge.user where email = ${body.email} LIMIT 1`
    // 여기 user!
    const user: IsignIn = await executeQuery(sql, '')

    if (user && (await bcrypt.compare(body.password, user.password))) {
        const { password, ...userWithoutPass } = user
        return new Response(JSON.stringify(userWithoutPass))
    } else return new Response(JSON.stringify(null))
}

TypeScript가 executeQuery 함수가 반환하는 값의 타입을 IsignUp으로 올바르게 판단하지 못했다. TypeScript는 executeQuery 함수가 무엇을 반환하는지 정확히 모르기 때문에 unknown이라는 타입을 가진 변수에 할당하려 하면서 발생하는 문제다.

해결 방법 중 하나는 executeQuery 함수의 반환값에 대한 타입을 명시적으로 지정해주는 것이다.

3. 에러 해결법 1

   // executeQuery 함수의 반환값에 대한 타입을 명시적으로 정의
   const userRow = await executeQuery(sql, '') as IsignUp;

그러나 위험이 있다. 자세한 건 아래 4번에서

4. : 과 as 차이

1) user: IsignUp

const user: IsignUp = ...

TypeScript에게 user 변수가 IsignUp 타입임을 알려주는 방식이다. 즉, user 변수에는 IsignUp 타입의 값이 들어와야 하며, 이는 컴파일러가 유형 검사를 수행할 수 있게 한다.

하지만 이는 실제로 데이터를 변환하지 않는다. 따라서, 변수에 할당된 값이 지정된 타입과 호환되지 않을 경우 TypeScript 오류가 발생할 수 있다.

1) user: IsignUp

const user = ... as IsignUp

형 변환의 의미를 가지며, 프로그램 실행 중에 실제로 값을 변환한다. TypeScript에게 해당 변수가 명시적으로 특정 타입으로 캐스팅되었음을 알려준다다.
이 방식은 TypeScript 컴파일러가 더 이상 해당 변수에 대해 타입 검사를 수행하지 않는 것을 의미한다. 그러므로, 변수에 할당된 값이 지정된 타입과 호환되지 않을 경우 오류가 발생하지 않는다. 단, 이는 런타임에서의 타입 안전성을 보장해주지 않을 수 있다.

5. 에러 해결법 2

app/_lib/db 에 타입을 명시적으로 준다.

profile
뚜잇뚜잇 FE개발자

0개의 댓글