타입스크립트에서 함수 매개변수 등을 정의할 때 때때로 우리는 익명 타입을 쓰기도 한다.
다음 코드를 살펴보자.
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>
을 사용하면 된다.
실제 사용 사례는 다음과 같다.
{}는 지금까지 당연히 빈 오브젝트 자료형일 줄 알고 썼는데...
이번에 이 덕분에 코드를 여기저기 수정해야 되게 생겼다.
얼핏 생각하면 상당히 비직관적인 타입인데 어째서 이런 구현을 했는지는 미스테리다...
도대체 어떤 이유로 이렇게 정의한 걸지는 모르겠지만 앞으로 이 빈 오브젝트 구현을 원할때는 조심해야겠다.