ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2019-09-27 개발일지
    개발일지 2019. 9. 27. 18:49

    어제에 이어서 마이그레이션을 시작했다.

     

    Node.js + Typescript + Express 환경을 만들고, prettier도 설정해서 TS 린트 설정도 해주고...

     

    시퀄라이즈로 DB도 모두 연결 및 연결 테스트가 완료되었다.

     

    패스포트를 통한 로그인 로그아웃 기능도 만들었다.

     

     

    근데 별 거 아닌 곳에서 시간을 20분이나 사용했는데...

     

    객체 디스트럭쳐링을 하고 그에 타입을 주는 것에서 시간을 날려먹었다.

     

    아래와 같이 req의 params에서 값을 디스트럭쳐링하는 과정이었다.

    const { value1, value2, value3 } = req.params;

     

    요로코롬 하고 이제 타입을 지정하기 위해서 아래와 같이 코드를 작성했는데 다음과 같은 에러가 발생했다.

    const { value1, value2, value3 }: { value1: string, value2: string, value3: number } = req.params;

     

    "Type 'Dictionary' is missing the following properties from type '{ value1: string; value2: string; value3: number; }': value1, value2, value3"

     

    각각의 값들에 대해서 타입 명시에 Dictionary 타입이 빠졌다며 에러를 발생시켰다.

     

    그래서 params를 타고 들어가봤다.

    express-serve-static-core의 index.d.ts다.

    params의 타입으로 P가 선언되있길래 더 타고 들어가봤다.

     

    express-serve-static-core의 index.d.ts다.

    Request라는 인터페이스의 타입으로 P가 선언되었는데 Params = ParamsDictionary를 확장하고 있었다.

    ParamsDictionary를 타고 들어가봤다.

     

    express-serve-static-core의 index.d.ts다.

    이렇게 ParamsDictionary는 Dictionary<string>으로 선언되어 있엇다.

     

     

    '아 그럼 이 타입에 맞춰줘야하나?' 싶어서 다음 처럼 코드를 변경해봤다.

    const { 
        value1, 
        value2, 
        value3 
    }: { 
        value1: Dictionary<string>, 
        value2: Dictionary<string>, 
        value3: Dictionary<number> 
    } = req.params;

     

    근데 여전히 동일한 에러가 발생했다.

    (뻘짓이었음 ㅋㅋ;)

     

     

    이게 문제가 아니었다.

    req.params는 Dictionary<string>이기 때문에 string 타입이 맞다.

     

    각각의 value에 타입을 지정한다고 했을 때, 만약 그곳에 undefined나 null이 들어간다면 어떻게 될까?

    undefined도 null도 타입은 아니지만 그렇다고 string도 number도 아니다.

     

    req.params를 디스트럭쳐링을 할 때 값이 있을 수도 있고 없을 수도 있기 때문에 반드시 string 타입의 값이 올 것이라 보장할 수가 없다.

    이 부분에서 strictNullChecks TS 컴파일 옵션이 발생하여 오류를 뿜뿜했던 것이다.

    const { 
        value1, 
        value2, 
        value3 
    }: { 
        value1?: string, 
        value2?: string, 
        value3?: string | number
    } = req.params;

     

    그렇기 때문에 undefined를 허용하기 위해서 Optional(?:)을 추가하여 타입을 정의해줬다.

     

    이제 value1, value2, value3에는 undefined나 string 타입의 값이 들어올 것이고, value3에는 undefined나 string, number타입의 값 할당이 가능해진다.

    '개발일지' 카테고리의 다른 글

    2019-10-01 개발일지  (0) 2019.10.01
    2019-09-30 개발일지  (0) 2019.09.30
    2019-09-26 개발일지  (0) 2019.09.26
    2019-09-25 개발일지  (0) 2019.09.25
    2019-09-24 개발일지  (0) 2019.09.24
Designed by Tistory.