[Typescript] Readonly object 의 key-value 를 뒤집은 타입 만들기

TODO

아래와 같은 ReadOnly Object 의 Key 와 Value 를 뒤집은 타입 만들기.

기존 Readonly Object

  const originalObject = {
    key1: 'value1',
    key2: 'value2'
  } as const;

만들고자 하는 타입 (위 객체의 Key-Value 를 뒤집은 객체)

  {
    value1: 'key1',
    value2: 'key2'
  };

How TO

Utility Type 를 활용해 아래와 같이 InvertKeyValue 타입을 만들어 준다.

  type _AllValues<T extends Record<string, string>> = {
    [P in keyof T]: { key: P & string, value: T[P] }
  }[keyof T];

  type InvertKeyValue<T extends Record<string, string>> = {
    [P in _AllValues<T>['value']]: Extract<_AllValues<T>, { value: P }>['key']
  };

InvertKeyValue 로 Key-Value 를 뒤집은 타입을 만들 수 있다.

const invertedObject: InvertKeyValue<typeof originalObject> = {
  value1: 'key1',
  value2: 'key2'
};

위의 방법으로 타입을 생성할 경우 Intellisense 도 잘 작동한다.

Intellisense 작동장면

참고한 글