타입스크립트 {}는 빈 오브젝트를 의미하지 않는다.

김성현·2022년 8월 3일
0
post-thumbnail

타입스크립트에서 함수 매개변수 등을 정의할 때 때때로 우리는 익명 타입을 쓰기도 한다.

다음 코드를 살펴보자.

function a(arg0:{flag:boolean, count:number}){}

이 함수는 첫번째 매개변수로 flag라는 논리 자료형과 count 라는 숫자형을 가진 오브젝트를 첫번째 매개변수로 받는다.

그런데 혹시, 여러가지 이유로 빈 오브젝트 타입을 매개변수로 넘겨야 한다고 생각해 보면 다음과 같은 코드를 짜게 될 것이다.

function a(arg0:{}){}

그런데 이는 틀렸다.

나는 이를 우연히 eslint를 사용하던 중 @typescript-eslint/ban-types 덕분에 알게 되었는데 위의 {} 타입은 정확히는 null이 아닌 어떤 타입이라는 뜻이라고 한다.

이를 확인하기 위해 다음 코드들을 확인해 보았다.

보다시피 일반적으로 예상 가능한 입력값을 받는 것이 아닌 정말 말 그대로, null undefined 빼고는 아무런 값이나 다 받는다.

따라서 {} 타입은 직관적이지 못해 사용을 자제해야 한다.

그러면 이런 경우 어떤 타입을 쓸 수 있을까?

만약 정말 어떤 키 값도 존재하지 않는 어떤 타입을 받고 싶다면 Record<string, never> 타입을 사용할 수 있다.

반대로 타입이기만 하면 어떤 타입이든 받게 하고 싶다면 Record<string, unknown>을 사용하면 된다.

실제 사용 사례는 다음과 같다.


{}는 지금까지 당연히 빈 오브젝트 자료형일 줄 알고 썼는데...
이번에 이 덕분에 코드를 여기저기 수정해야 되게 생겼다.

얼핏 생각하면 상당히 비직관적인 타입인데 어째서 이런 구현을 했는지는 미스테리다...

도대체 어떤 이유로 이렇게 정의한 걸지는 모르겠지만 앞으로 이 빈 오브젝트 구현을 원할때는 조심해야겠다.

profile
수준 높은 기술 포스트를 위해서 노력중...

0개의 댓글