Я пытаюсь создать реактивный повторно используемый компонент: таблицу, которая должна быть либо списком команд, либо списком игр. Следовательно, запрос GraphQL отличается в зависимости от того, что извлекается.
поэтому у меня есть эти интерфейсы и типы:
export interface Team {
id: string;
name: string;
}
export interface Game {
id: string;
competition: string;
}
export interface Data {
allElems?: Team[] | Game[]
[elements: string]: Team[] | Game[] | undefined
}
Мой компонент выглядит так:
interface SectionTableProps {
query: object
}
class SectionTableQuery extends Query<Data, {}> {}
class SectionTable extends React.Component<SectionTableProps, {}> {
constructor(props: SectionTableProps) {
super(props);
}
render() {
return (
<SectionTableQuery query = {this.props.query}>
{({ data = {}, error, loading }) => {
if (loading) {
return <tbody><tr><td>LOADING</td></tr></tbody>
};
if (error !== undefined) {
return <tbody><tr><td>ERROR</td></tr></tbody>
};
return (
<tbody>
{Object.keys(data).map(elements => {
data[elements].map(
elem => (
<tr key = {elem.id} >
<th scope = "row">{elem.id}</th>
{Object.keys(elem).map(k => {
if (k !== "id" && k !== "__typename") {
return <td key = {elem[k]}>{elem[k]}</td>
}
})}
</tr>
)
)
}
)
}
</tbody>
);
}}
</SectionTableQuery>
)
}
}
но я получаю следующую ошибку:
TypeScript error: Cannot invoke an expression whose type lacks a call signature. Type '(<U>(callbackfn: (value: Team, index: number, array: Team[]) => U, thisArg?: any) => U[]) | (<U>(callbackfn: (value: Game, index: number, array: Game[]) => U, thisArg?: any) => U[])' has no compatible call signatures. TS2349
42 | <tbody>
43 | {Object.keys(data).map(elements => {
> 44 | (data[elements] || []).map(
| ^
45 | elem => (
46 | <tr key = {elem.id}>
47 | <th scope = "row">{elem.id}</th>
Почему это так ? Я действительно не знаю, почему Game и Team несовместимы...
привет @hazardous спасибо за вашу помощь! к сожалению, это не работает, выдает другую ошибку, потому что allElems не является обязательным
Можно ли где-нибудь поделиться более полным кодом?
Я только что понял, почему я не мог писать свои интерфейсы таким образом; Я написал ответ ;)





Просто нашел решение; хотя не знаю, лучший ли он:
В моем случае я должен использовать слияние объявлений :
я не могу писать
export interface Team {
id: string;
name: string;
}
export interface Game {
id: string;
competition: string;
}
export interface Data {
allElems?: Team[] | Game[]
[elements: string]: Team[] | Game[] | undefined
}
так как я получу ошибку, упомянутую в моем первоначальном сообщении. Вместо этого я должен объявить свои интерфейсы так:
//team
interface Elem {
id: string;
name?: string;
[attr: string]: string | number | undefined
}
//game
interface Elem {
id: string;
homeTeamScore?: number
competition?: string
round?: string
}
export interface Data {
elem?: Elem
[elements: string]: Elem | undefined
}
At the most basic level, the merge mechanically joins the members of both declarations into a single interface with the same name.
Попробуйте удалить undefined из объявления Data [elements].