Недавно я начал писать машинописные тексты, и мне было любопытно, как пропустить глубину уровня. можно ли пропустить уровень глубины в машинописном тексте?
// from
A -> B -> C
// to
A -> C
const sample = {
A: {
B: {
C: "one",
}
},
};
type Make<A, Z> = {
[B in keyof A]: {
[C in keyof A[B]]: {
[D in keyof A[B][C]]: Z;
}
};
};
function foo<T>(object: T): Make<T, number> {
return object as any;
}
// outputs: one
console.info(foo(sample).A.B.C);
что, если мы хотим пропустить один уровень вот так?
// expected output: one
console.info(foo(sample).A.C);
Я пытался сделать это, но это не сработало
type Make2<A, Z> = {
[B in keyof A]: {
[D in keyof A[B][]]: Z;
};
};
function foo2<T>(object: T): Make2<T, number> {
return object as any;
}
// doesnt work
console.info(foo2(sample).A.C);
Типы Typescript никогда не повлияют на поведение во время выполнения; это одна из целей Typescript. Если вы хотите удалить объект, вам нужно написать логику в виде кода, а не типов.
Вы можете просто пропустить средний уровень, используя переназначение клавиш и условную типизацию.
Мы перебираем значения объекта с помощью метода доступа переназначения в [K in keyof T]
, проверяя, являются ли его дочерние элементы T[K]
объектами, если да, мы возвращаем предполагаемый дочерний элемент T[K]
, Item
, в противном случае мы просто возвращаем T[K]
type SkipFirstDepth<T extends Record<string, any>> = {
[K in keyof T]: T[K] extends Record<string, infer Item> ? Item : T[K];
};
type Make = SkipFirstDepth<typeof sample>
Тогда он будет печатать
{
A: {
C: string;
};
}
В качестве альтернативы, если вы хотите полностью пропустить все остальные слои, вам придется использовать рекурсивные типы.
type SkipEveryOtherDepth<T extends Record<string, any>> = {
[K in keyof T]: T[K] extends Record<string, infer Item>
? Item extends Record<string, any>
? SkipEveryOtherDepth<Item>
: Item
: T[K];
};
type Example = SkipEveryOtherDepth<{
foo: {
bar: {
foo: {
bar: {
foo: 'bar';
};
};
};
};
}>;
Тогда окончательный тип будет
{
foo: {
foo: {
foo: 'bar';
};
};
}
Я сделал это спонтанно, так что это может работать не для каждой формы объекта, но определенно работает в приведенных примерах.
Проверьте эти примеры в действии на детской площадке.
спасибо, что нашли время и ответили на вопрос!
почему ты хочешь сделать это? Что вы пытаетесь достичь?