Отображение универсального интерфейса TypeScript с неизвестной глубиной - PullRequest
0 голосов
/ 05 июня 2018

У меня есть рекурсивная функция, которая принимает объект с универсальным интерфейсом.Функция пересекает объект и создает новый объект с почти точно таким же интерфейсом, за исключением конечных узлов / листьев, она преобразует их в числа.Функция возвращает этот новый объект, но я не могу выяснить, как придать этому правильный тип.

Пример:

interface IOriginal
{
    prop1: string,
    prop2: number,
    prop3: {
        prop1: boolean,
        prop2: {
            prop1: number
        },
        prop3: string
    }
}

const input : IOriginal = {
    prop1: "somestring",
    prop2: 5,
    prop3: {
        prop1: true,
        prop2: {
            prop1: 2
        },
        prop3: "otherstring"
    }
}

function traverse<T>(obj: T)
{
    /* ... map the object ... */
    return mappedObj
}

const output = traverse(input)

и интерфейс вывода (сопоставленного объекта) должен выглядеть как

interface IOutput
{
    prop1: number,
    prop2: number,
    prop3: {
        prop1: number,
        prop2: {
            prop1: number
        },
        prop3: number
    }
}

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

1 Ответ

0 голосов
/ 05 июня 2018

Вы можете использовать условные типы для достижения этого результата:

type LeafsToNumbers<T> = 
    T extends string | number | boolean  ? number :  // If primitive transform to number
    { [ P in keyof T] : T[P] extends (infer U)[] ? LeafsToNumbers<U>[] : LeafsToNumbers<T[P]> }; // Otherwise recursively map, with a special case for arrays.

function traverse<T>(obj: T) : LeafsToNumbers<T>
{
    /* ... map the object ... */
    return null as any;
}
let a: IOriginal;
let o = traverse(a);
o.prop1 //number
o.prop3.prop1 // number
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...