Вывод нескольких типов данных
Здравствуйте
Есть такой массив: 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) |
Цитата:
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) |
:write: если js
let arr = [ {id: "1", data: "sadsa"}, {id: "2", text: "sdsadsa"} ] let o = arr.find(a => "text" in a) console.log(o) |
Для TS еще вот так прокатит
if ('text' in arr[1]) console.log(arr[1].text) |
Еще можно так:
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 |
Если хотите работать "свободно" - можно тупо не задавать тип 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); |
Цитата:
|
Цитата:
|
Часовой пояс GMT +3, время: 05:35. |