Argument of type 'FindOptions<User>' is not assignable to parameter of type 'FindOneOptions<User>'. Types of property 'comment' are incompatible. Type 'unknown' is not assignable to type 'string | undefined'.

 

원인은 FindOptions<User>FindOneOptions<User>의 하위 타입이 아니기 때문에 발생했으며, FindOneOptions<User> 타입은 findOne() 메서드에 전달되는 옵션 객체의 타입이란다.

import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository, FindOneOptions } from 'typeorm';
import { User } from '../../domains/entities/User.entity';

@Injectable()
export class EmailService {
  constructor(
    @InjectRepository(User)
    private usersRepository: Repository<User>,
  ) {}

  validateEmailFormat(email: string): boolean {
    const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
    return emailRegex.test(email);
  }

  async checkDuplicateEmail(email: string): Promise<boolean> {
    const options: FindOneOptions<User> = {
      where: {
        email: email,
      },
    };

    const existingUser = await this.usersRepository.findOne(options);
    return !!existingUser;
  }
}
//거의 다 똑같고 위의 import 셋째줄에서 FindOptions를 FindOneOptions로 바꿔주면 끝이다.

checkDuplicateEmail() 메서드 내에서 검색 조건으로 이메일 값을 사용하도록 수정한 것이다. FindOneOptions<User> 타입을 사용하여 검색 옵션 객체를 정의하고, 해당 객체를 findOne() 메서드에 전달하여 중복된 이메일을 확인한다.

 

그리고 위처럼 고치니,

Object literal may only specify known properties, and 'email' does not exist in type 'FindOptionsWhere<User> | FindOptionsWhere<User>[]'.

The expected type comes from property 'where' which is declared here on type 'FindOneOptions<User>

두 개의 오류가 동시에...ㅋㅋㅋ 차분하게 수정해보자.

 

import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository, FindOneOptions } from 'typeorm';
import { User } from '../../domains/entities/User.entity';

@Injectable()
export class EmailService {
  constructor(
    @InjectRepository(User)
    private usersRepository: Repository<User>,
  ) {}

  validateEmailFormat(email: string): boolean {
    const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
    return emailRegex.test(email);
  }

  async checkDuplicateEmail(email: string): Promise<boolean> {
    const options: FindOneOptions<User> = {
      where: {
        email: email,
      },
    };

    const existingUser = await this.usersRepository.findOne(options);
    return !!existingUser;
  }
}

?? 뭐가 다른지 모르겠다. 첫번째 코드랑 두번째 코드랑 다른게 없는데 1번째는 오류가 2개나 나고 2번째는 멀쩡하다 왜??

맞왜틀?? 오류의 원인은 FindOneOptions<User>where 속성에 정의되지 않은 속성인 'email'을 사용하려고 하기 때문에 발생합니다. 이 오류를 해결하기 위해서는 where 속성을 올바르게 정의해야 한다고 한다. 1번도 올바르게 정의 됐는데?? 진짜 이해 할 수가 없다..

 

5편에서 계속..

+ Recent posts