Показать сообщение отдельно
  #6 (permalink)  
Старый 22.12.2024, 01:19
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,590

Если хотите работать "свободно" - можно тупо не задавать тип arr, автовыеденный будет:
({
    id: string;
    data: string;
    text?: undefined;
} | {
    id: string;
    text: string;
    data?: undefined;
})[]
Однако по-хорошему, тип для надёжности и чёткости стоит задавать именно так как вы его задали, а перед выводом проверять что именно вы выводите.
if('text' in arr[1]) console.log(arr[1].text);
Это самый правильный подход, если в массиве могут оказаться разные значения.


P.S. По-хорошему типы надо называть с большой буквы. По-хорошему в вашем случае они должны быть в едиственном числе(потому что обозначают одну сущность, а не много). В идеале для каждого типа стоит иметь тайпгард и применять именно его для сужения типа, вместо проверки каких-то свойств. Примерно так:
type Fruit = {
  id: string,
  data: string
}

const isFruit = (arg: any): arg is Fruit => !!arg && typeof arg.id === 'string' && typeof arg.data === 'string';

type Vegetable = {
  id: string,
  text: string
}

const isVegetable = (arg: any): arg is Vegetable => !!arg && typeof arg.id === 'string' && typeof arg.text === 'string';

let arr: Array<Fruit | Vegetable> = [
  {id: "1", data: "sadsa"}, 
  {id: "2", text: "sdsadsa"}
]

if (isVegetable(arr[1])) console.log(arr[1].text);
__________________
29375, 35

Последний раз редактировалось Aetae, 22.12.2024 в 01:30.
Ответить с цитированием