문제상황
1
2
3
4
5
6
7
8
9
private foo(data: { id: string }) {
const { id } = data;
if(typeof id === 'string') {
// ...
} else {
debug('invalid data type');
}
}
- 타입스크립트 언어를 사용하는 프로젝트, 위와같은 상황에서
foo()
의 매개변수로 전해지는id
는 항상string
형이어야 하고, 그렇지 않으면 타입이 맞지 않아 컴파일타임에 에러가 발생한다. - 따라서, 이 프로젝트에서 개발하는 입장으로 본다면, 조건문
if(typeof id === 'string')
의 결과는 어떠한 경우에도 절대 falsy하지 않다고 판단했다.- IDE에서도 “Redundant typeof check: ‘owtUserID’ always has type ‘string’ “ 라는 메시지와 함께 해당 줄이 불필요하다는 메시지를 보낸다.
오류
파라미터에서 type을 지정해주는 것은 형식을 명시함으로써 개발자가 적절한 개발을 할 수 있게하는 목적이지, 외부에서 항상 해당 type에 맞는 데이터를 전해줄 것을 보장하지 못한다.
- 심지어 해당 프로젝트 내부에서도
const data: any = { id: 123 };
이러한 data를 argument로 전달한다면, 컴파일에러 없이 그냥 통과하게 된다.
- 심지어 해당 프로젝트 내부에서도
해당 부분에서
data
라는 데이터는 socket 연결 후 어떠한 소켓 이벤트에 의해 전해지는 데이터이다.일반적으로 API 호출이라면 ajv와 같은 패키지를 통해 JSON 데이터의 형식 검증을 할 수 있다고 한다.
1 2 3 4 5 6
const schema: JSONSchemaType<Seed> = { type: 'object', properties: { // ... } }
소켓 이벤트로 전해진 하나짜리 데이터(그냥 string)를 이런 방법 보다 그냥
if(typeof id === 'string')
처럼 검증해준 것 뿐.
결론
: 함수 파라미터의 역할을 다시 생각해보자. 형식, 타입을 지정함으로써 개발자가 적절한 데이터를 전달받고, 그걸 통해 의도했던 대로 로직을 작성하기 위한 목적이지, 외부에서 전해지는 데이터까지 막는 역할은 하지 못한다.