2

Например, есть объект const obj = { a: 'table', b: { c: 'brown' }

Нужно забрать все ключи объекта и присвоить их в виде значений к другим ключам

Сам объект типизировал так type ObjType<K> = { key: keyof K; value: string; }

Не могу понять как типизировать вложенный объект и назначить key - value к ключам b и c?

Пробовал использовать type Partial<R> = { [P in keyof R]: R[P] } - не получилось, как я этот тип не крутил

Нужно получить массив объектов, [ {key: a, value: ""}, {key: b, value: "", items: {key: c, value: "" }}]

7
  • Нужно забрать все ключи объекта и присвоить их в виде значений к другим ключам - покажи пример, который ты ожидаешь получить. Сейчас непонятно, какой результат тебе нужен, для твоего объекта. Commented 6 апр. в 16:39
  • Добавил результат Commented 6 апр. в 16:54
  • Нужно получить массив объектов - то есть, у тебя есть объект, и есть функция, которая делает массив и ты хочешь автоматом вывести тип этого массива, так? Commented 6 апр. в 16:56
  • мне нужен по итогу тип, например type ObjType<K> = {key: keyof K , value: string, items?: {key: keyof K , value: string}}, который я смогу вот так присвоить объекту const obj: ObjType<K>[] Commented 6 апр. в 17:02
  • Какая может быть вложенность объектов? Только такая { a: 'table', b: { c: 'brown' }} или любой глубины? Commented 6 апр. в 17:07

1 ответ 1

2

Вот, если я правильно поняд задачу: cсылка на Playground

Код:

type GetArgsTuple<F, R extends unknown[] = []> = F extends (() => infer X)
    ? F extends (infer A) & (() => X)
        ? GetArgsTuple<A, [X, ...R]>
        : R
    : R;

type UnionToTuple<U> = GetArgsTuple<
    (U extends unknown
        ? (a: () => U) => void
        : never) extends (a: infer P) => void ? P : never
>;


type GetNestedKeys<T> = UnionToTuple<{
    [K in keyof T]: T[K] extends Record<PropertyKey, unknown>
        ? {key: K; items: GetNestedKeys<T[K]>}
        : {key: K; value: T[K]};
}[keyof T]>



// ---- example --------

const obj = {
    a: 'table',
    b: { c: 'brown', f: () => true },
    e: {x: 'preved', y: 'medved', z: {v: 1}}
};

type NestedKeys = GetNestedKeys<typeof obj>;
3
  • Перенеси важную часть из ссылки непосредственно в ответ Commented 6 апр. в 20:17
  • @Grundy поправил Commented 6 апр. в 20:25
  • @Alexandroppolus Большое спасибо Commented 7 апр. в 6:37

Начните задавать вопросы и получать на них ответы

Найдите ответ на свой вопрос, задав его.

Задать вопрос

Изучите связанные вопросы

Посмотрите похожие вопросы с этими метками.