Ваша структура заставляет reportData
иметь тип IReportItem
, который является: IReportItemRegions
или IReportItemFactionStatus
, потому что это элемент массива report
.
Вы хотите отобразить свойство regions
, которое реализовано только в интерфейсе IReportItemRegions
. Мы не знаем, относится ли reportData
к типу IReportItemRegions
. Прежде чем пытаться получить доступ к свойству, вы должны убедиться, что ваш объект реализует свойство:
if ('regions' in reportData) {
console.log(reportData.regions)
}
Если вы хотите, чтобы TypeScript выводил тип, вы должны избавиться от find
и переписать свой код. Я пришел с простой реализацией:
let reportData: IReportItemRegions;
let i = 0;
while (!reportData && report.length < i) {
const currentReportData = report[i];
if (currentReportData.type === 'REGIONS') {
// Typescrit knows currentReportData is of type IReportItemRegions
reportData = currentReportData;
}
i++;
}
if (!reportData) {
return [];
}
console.log(reportData.regions);
Вы в основном хотите:
entry.Element(xmlns + "author").Element(xmlns + "name").Value
Но Вы могли бы хотеть перенести это в дополнительный метод, таким образом, можно легко принять соответствующие меры, если или автор или называет элементы, отсутствуют. Вы могли бы также хотеть думать о том, что Вы хотите произойти, если существует больше чем один автор.
Канал мог бы также иметь элемент автора... просто другая вещь принять во внимание.
Это могло быть что-то вроде этого:
var story = from entry in stories.Descendants(xmlns + "entry")
from a in entry.Descendants(xmlns + "author")
select new Story
{
Title = entry.Element(xmlns + "title").Value,
Content = entry.Element(xmlns + "subtitle").Value,
Author = new AuthorInfo(
a.Element(xmlns + "name").Value,
a.Element(xmlns + "email").Value,
a.Element(xmlns + "uri").Value
)
};