Я хотел бы отобразить объект рекурсивно так, чтобы примитивные значения в объекте были преобразованы в некоторый другой тип.
Например, я бы хотел такой объект:
const before = { a: { c: '' }, b: [ '', { d: '' } ] }
чтобы стать таким:
const after = { a: { c: Test }, b: [ Test, { d: Test } ] }
Я также предполагаю, что значения не будут Date
, Symbol
или null / void. Просто сериализуемые типы JSON, такие как строка, числа и т. Д. (Кроме нуля)
Вот что я попробовал:
type ConvertToTest<T> = {
[P in keyof T]: T[P] extends any[]
? ConvertToTest<T[P]>
: T[P] extends {}
? ConvertToTest<T[P]>
: Test;
}
function convert<T>(o: T): ConvertToTest<T> {
// ...
}
Используются условные типы , представленные в Typescript 2.8.
const after = convert(before)
приводит к after.a.c
с дополнениями типа string
в редакторе для c
вместо дополнений для Test
.
Как мне переписать type ConvertToTest<T>
, чтобы убедить Typescript в том, что after.a.c
имеет тип Test
?
РЕДАКТИРОВАТЬ: Вот ссылка Typescript Playground , иллюстрирующая выше.