-
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를 타고 들어가봤다.
params의 타입으로 P가 선언되있길래 더 타고 들어가봤다.
Request라는 인터페이스의 타입으로 P가 선언되었는데 Params = ParamsDictionary를 확장하고 있었다.
ParamsDictionary를 타고 들어가봤다.
이렇게 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