У меня есть массив типа object[] & Tree[]
, но arr.map(child => ...)
выводит тип потомка как object
, а не object & Tree
.
Есть ли способ избежать этого без дополнительного приведения?
В частности, Tree
расширяет object
, но машинописный текст, похоже, не осознает этого и объединяет две части типа пересечения.
EDIT - Минимальный воспроизводимый пример:
Это надумано, но основано на моем другом недавнем вопросе Преобразование типа объекта машинописного текста в сопоставленный тип, который ссылается на себя
interface BasicInterface {
name: string;
children: object[];
}
function getBasic<T extends object>(input: T): BasicInterface {
return input as BasicInterface;
}
export const basicTree = getBasic({
name: 'parent',
children: [{
name: 'child',
children: []
}]
});
Дело в том, что приведенный ниже код имеет доступ к "basicTree" и его предполагаемый тип. Для этого примера я определил BasicInterface, но на практике это генерируется автоматически, и я не нашел способа программно сгенерировать рекурсивный интерфейс.
Я хотел бы добавить рекурсивный тип потомков обратно в качестве исходного Интерфейс определяет.
Вместо того, чтобы полностью переопределить BasicInterface в коде, поскольку это может быть много шаблонного, я пытаюсь «улучшить» определение типа basicTree с помощью правильного рекурсивного определения.
Но это падает при получении типа детей. Возможно, есть более простое решение?
type RestoredInterface = typeof basicTree & {
children: RestoredInterface[]
};
function getTree(basic: BasicInterface): RestoredInterface {
return basic as RestoredInterface;
}
const restoredTree = getTree(basicTree);
const names = restoredTree.children.map(child => child.name);