FEB:)DAIN

Object.key/Entries/FromEntries 메서드 사용할 때도 타입이 잘 추론되게 할 수는 없을까? 본문

코딩/공부

Object.key/Entries/FromEntries 메서드 사용할 때도 타입이 잘 추론되게 할 수는 없을까?

얌2 2023. 8. 13. 16:24
728x90

Object.key/Entries/FromEntries 메서드를 사용하면 타입스크립트가 key 타입을 제대로 추론하지 못했다. 제대로 타입 추론이 되도록 하고 싶어서 유틸 함수를 만들기로 했다.

 

// getTypedObjectKeys.ts 
export const getTypedObjectKeys = <T extends object>(obj: T) => {
  return Object.keys(obj) as Array<keyof T>;
};

 

// getTypedObjectEntries.ts
type Entries<T> = {
  [K in keyof T]: [K, T[K]];
}[keyof T][];

export const getTypedObjectEntries = <T extends object>(obj: T) => {
  return Object.entries(obj) as Entries<T>;
};

 

// getTypedObjectFromEntries.ts
export const getTypedObjectFromEntries = <T extends string | symbol, K>(
  entries: readonly [T, K][]
): { [Key in T]: K } =>
  entries.reduce(
    (result, [key, value]) => {
      result[key] = value;

      return result;
    },
    {} as { [Key in T]: K }
  );

 

이 유틸을 응용한 버전도 있다.

/**
 * 
 * @example getTypedObjectFromEntries(KEYS, VALUES)
 * @returns key: value | value | value | ...
 *
 * @example getTypedObjectFromEntries(
      KEYS,
      KEYS.map(() => OBJECTS)
    )
 * @returns key: value[OBJECT, {...}, ...] (= key: object[])
 */
export const keyValuePairsToObject = <T extends string | symbol, K>(
  keys: readonly T[],
  values: readonly K[]
): { [Key in T]: K } =>
  keys.reduce(
    (result, key, index) => {
      result[key] = values[index];

      return result;
    },
    {} as { [Key in T]: K }
  );

 

728x90