export type NavDataItem =
| {
name: string;
link: string;
}
| {
name: string;
children: NavDataItem[];
};
export const navData: NavDataItem[] = [
{
name: "Название меню 1",
link: "path_to_page",
},
{
name: "Название меню 2",
children: [
{
name: "Название меню 1",
link: "path_to_page",
},
{
name: "Название меню 2",
link: "path_to_page",
},
]
},
]
interface NavDataBase {
name: string;
link: string;
}
interface NavDataChilds {
name: string;
children: NavDataBase[];
}
export type NavDataList = (NavDataBase | NavDataChilds)[];
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
}
});
typescript почему то в автокомплите показывает свойство name игнорируя остальные
if ("children" in obj) {
obj.children ...
} else {
obj.link ....
}
export type NavDataItem =
| {
type: 'a',
name: string;
link: string;
}
| {
type: 'b',
name: string;
children: NavDataItem[];
};