Вход

Просмотр полной версии : Вывод нескольких типов данных


Raadsert
21.12.2024, 18:21
Здравствуйте

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



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)

ksa
21.12.2024, 20:06
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)

рони
21.12.2024, 20:20
:write: если js
let arr = [

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

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

]
let o = arr.find(a => "text" in a)
console.log(o)

ksa
21.12.2024, 20:30
Для TS еще вот так прокатит

if ('text' in arr[1]) console.log(arr[1].text)

Nexus
21.12.2024, 21:14
Еще можно так:
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 (https://www.typescriptlang.org/play/?ts=5.7.2#code/C4TwDgpgBAZgTgVwJbAM5QLxQN4FgBQAkEgCYBcUqwcSAdgOYA 0BhJAhsGxVTQwQL4FQkKADcI9CJwBGAGwjoseIqW7U6TFsAgAP YGt70BBAvOBQ2cOJigBtAlEdPH2VVABEARneMo7ThTuqGwkwe7 8FujwyGi+Ds5OruQeAEw+UNp6gaihIWERbOjikjLyqMz4ALqRU ADGAPa0VADcJvgNTfXyAHSy9fQAFJZwtgAMld3+bACUzUA)

Или так:
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 (https://www.typescriptlang.org/play/?ts=5.7.2#code/C4TwDgpgBAZgTgVwJbAM5QLxQN4FgBQAkEgCYBcUqwcSAdgOYA 0BhJAhsGxVTQwQL4FQkKADcI9CJwBGAGwjoseIqW7U6TFsAgAP YGt70BBAvOBQ2cOBTgQ2JAPa1ZIKAG14yNIzESpbOQUAXUx3Ai gIyIjsVSgAIgBGOJ92Tgo41HtMuP4fcKjImPJ4gCZkqG09dNQS TNq2HOZ8IIBuE3wAYydUB3kAOlkHegAKSzg3AAYgvtS2AEoWoA )

Aetae
22.12.2024, 01:19
Если хотите работать "свободно" - можно тупо не задавать тип 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);

Raadsert
22.12.2024, 01:45
Для TS еще вот так прокатит

if ('text' in arr[1]) console.log(arr[1].text)

Очень хороший вариант. Спасибо.

ksa
22.12.2024, 10:58
if('text' in arr[1]) console.log(arr[1].text);
Это самый правильный подход, если в массиве могут оказаться разные значения.

Не зря значит я книжку по TS читаю... :dance: