@VelkinVV

Как проверить тип объекта при конвертировании из другого типа в TS?

Помогите решить задачу. Пишу функцию конвертер, которая принимает объект и должна его конвертировать в другой объект. Делаю это так:

const converter = <T extends object, R>(obj: T): R => {
  return Object.assign({}, ...Object.entries(obj)?.map(([k, v])=> {
    if (k === 'type') {
      return {[k]: v.toString()}
    }
  }))
}

Пример сильно упрощён, но Object.assign возвращает объект any, а как мне проверить, что возвращаемый объект может быть конвертирован в тип R? Функция используется рекурсивно.

=====================

Для проверки, может ли быть объект а конвертирован в б я использовал вот такой пример. Сразу оговорюсь, что в моём случае проверка типов не нужна, по этому она упущена.

type DeepKeys<T> = T extends object
  ? { [K in keyof T]: K extends string ? `${K & string}` : never }[keyof T]
  : '';

type CanConvert<T, U> = DeepKeys<U> extends DeepKeys<T> ? U : never;

const converter = <T extends object, R>(obj: T): CanConvert<T, R> => {
  return Object.assign({}, ...Object.entries(obj)?.map(([k, v])=> {
    if (k === 'type') {
      return {[k]: v.toString()}
    }
  }))
}


Теперь, в случае изменения структуры объекта А и невозможности получить на выходе нужный объект Б, я получу ошибку
  • Вопрос задан
  • 97 просмотров
Решения вопроса 1
@VelkinVV Автор вопроса
type DeepKeys<T> = T extends object
  ? { [K in keyof T]: K extends string ? `${K & string}` : never }[keyof T]
  : '';

type CanConvert<T, U> = DeepKeys<U> extends DeepKeys<T> ? U : never;
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Alexandroppolus
@Alexandroppolus
кодир
судя по данному примеру, достаточно убрать R из генерика, а тип возвращаемого значения указать как

{type?: string}

конкретно здесь Object.assign выглядит как "индусский код", но ведь в реальности что-то более сложное надо?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы