Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 21.12.2024, 18:21
Кандидат Javascript-наук
Отправить личное сообщение для Raadsert Посмотреть профиль Найти все сообщения от Raadsert
 
Регистрация: 09.12.2021
Сообщений: 102

Вывод нескольких типов данных
Здравствуйте

Есть такой массив:

type fruits = {
	id: string,
	data: string
}
type vegetables = {
	id: string,
	text: string
}

let arr: (fruits | vegetables)[] = [
        {id: "1", data: "sadsa"}, 
        {id: "2", text: "sdsadsa"}
]


Как из такого массива можно достать объект с параметром text, так чтоб TS не жаловался?

console.log(arr.text)
Ответить с цитированием
  #2 (permalink)  
Старый 21.12.2024, 20:06
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,228

Сообщение от Raadsert
console.log(arr.text)
Как вариант...
type fruits = {
	id: string,
	data: string
}
type vegetables = {
	id: string,
	text: string
}

let arr: (fruits | vegetables)[] = [
        {id: "1", data: "sadsa"}, 
        {id: "2", text: "sdsadsa"}
]
const o = arr[1] as vegetables
console.log(o.text)

Последний раз редактировалось ksa, 21.12.2024 в 20:13.
Ответить с цитированием
  #3 (permalink)  
Старый 21.12.2024, 20:20
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

если js
let arr = [

        {id: "1", data: "sadsa"},

        {id: "2", text: "sdsadsa"}

]
let o = arr.find(a => "text" in a)
console.log(o)
Ответить с цитированием
  #4 (permalink)  
Старый 21.12.2024, 20:30
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,228

Для TS еще вот так прокатит

if ('text' in arr[1]) console.log(arr[1].text)
Ответить с цитированием
  #5 (permalink)  
Старый 21.12.2024, 21:14
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,796

Еще можно так:
type fruits = {
	id: string,
	data: string
}
type vegetables = {
	id: string,
	text: string
}

let arr = [
        {id: "1", data: "sadsa"} as fruits, 
        {id: "2", text: "sdsadsa"} as vegetables,
] as const;

console.log(arr[0].data);

ts playground

Или так:
type fruits = {
	id: string,
	data: string
}
type vegetables = {
	id: string,
	text: string
}

let arr: readonly [fruits, vegetables] = [
        {id: "1", data: "sadsa"}, 
        {id: "2", text: "sdsadsa"},
];

console.log(arr[0].data);

ts playground
Ответить с цитированием
  #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.
Ответить с цитированием
  #7 (permalink)  
Старый 22.12.2024, 01:45
Кандидат Javascript-наук
Отправить личное сообщение для Raadsert Посмотреть профиль Найти все сообщения от Raadsert
 
Регистрация: 09.12.2021
Сообщений: 102

Сообщение от ksa Посмотреть сообщение
Для TS еще вот так прокатит

if ('text' in arr[1]) console.log(arr[1].text)
Очень хороший вариант. Спасибо.
Ответить с цитированием
  #8 (permalink)  
Старый 22.12.2024, 10:58
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,228

Сообщение от Aetae
if('text' in arr[1]) console.log(arr[1].text);

Это самый правильный подход, если в массиве могут оказаться разные значения.
Не зря значит я книжку по TS читаю...
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чтение и вывод данных из нескольких файлов Nikc174 Элементы интерфейса 7 15.06.2018 15:54
отправка данных из формы и вывод полученных данных sxe jQuery 2 21.05.2013 00:34
Двойная Фильтрация данных таблицы David0707 Общие вопросы Javascript 0 19.03.2012 13:00
Вывод данных в Друпал 6 из MySQL, небольшая работа torquemada Работа 1 22.05.2011 17:05
Вывод данных из mysql Евген AJAX и COMET 3 22.08.2010 17:55