Можно сделать защитников типа:
interface INavDataBase {
name: string;
link: string;
}
interface INavDataChilds {
name: string;
children: INavDataBase[];
}
type TNavData = INavDataBase | INavDataChilds;
export const navData: TNavData[] = [
{
name: "Название меню 1",
link: "path_to_page",
},
{
name: "Название меню 2",
children: [
{
name: "Название меню 1",
link: "path_to_page",
},
{
name: "Название меню 2",
link: "path_to_page",
},
],
},
];
// Здесь можно по разному проверять и hasOwnProperty или "link" in navData
export const isNavDataBase = (navData: TNavData): navData is INavDataBase =>
navData.hasOwnProperty("link");
export const isNavDataChilds = (navData: TNavData): navData is INavDataChilds =>
navData.hasOwnProperty("children");
navData.forEach((data) => {
if (isNavDataBase(data)) {
// Здесь будет автокомплит при обращении - data.link
} else {
// И здесь, хотя второго защитника мы не использовали - data.children
}
});