#How to fix this type i need automatically convert parse dynamic type (T) to camelcase version

2 messages · Page 1 of 1 (latest)

fossil sun
#

 import { get } from '@/lib/api/core';
import { convertSnakeToCamel } from '@/utils/convert-snake-to-camel';
import { getQueryString } from '@/utils/core';
import { toThrowResponseError } from '@/utils/mappers/response-mapper';

interface SkillResponse {
  skill_type: string;
  skill_names: string[];
}

export const getSkills = async (sortByType = true) => {
  try {
    const query = getQueryString({ sort_by_type: sortByType });
    const response = await get<SkillResponse[]>(`/skills${query}`);
    return convertSnakeToCamel(response);
  } catch (e: FetchBackendError) {
    return toThrowResponseError();
  }
};

export const isObject = (object: unknown): object is Object =>
  !!object && typeof object === 'object';
#

const toCamelCase = (s: string) =>
  s.replace(/[-_](.)/g, (_, c) => c.toUpperCase());

const toSnakeCase = (s: string) =>
  s.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);

export const convertSnakeToCamel = <T>(obj: T): KeysToCamelCase<T> => {
  if (!isObject(obj)) return obj as KeysToCamelCase<T>;
  if (Array.isArray(obj)) {
    return obj.map((item) =>
      convertSnakeToCamel(item),
    ) as unknown as KeysToCamelCase<T>;
  }
  const newObject: Record<string, unknown> = {};
  Object.keys(obj).forEach((key) => {
    const camelCaseKey = toCamelCase(key);
    newObject[camelCaseKey] = convertSnakeToCamel(
      (obj as Record<string, unknown>)[key],
    );
  });
  return newObject as KeysToCamelCase<T>;
};

export const convertCamelToSnake = <T>(obj: T): KeysToSnakeCase<T> => {
  if (!isObject(obj)) return obj as KeysToSnakeCase<T>;
  if (Array.isArray(obj)) {
    return obj.map((item) =>
      convertCamelToSnake(item),
    ) as unknown as KeysToSnakeCase<T>;
  }
  const newObject: Record<string, unknown> = {};
  Object.keys(obj).forEach((key) => {
    const snakeCaseKey = toSnakeCase(key);
    newObject[snakeCaseKey] = convertCamelToSnake(
      (obj as Record<string, unknown>)[key],
    );
  });
  return newObject as KeysToSnakeCase<T>;
};