Как вернуть один тип из функции - PullRequest
0 голосов
/ 12 января 2020

Я пытаюсь построить вспомогательную функцию в Typescript (React). Я определил функцию, которая возвращает object или object[] на основе данных ответа.

Теперь, когда я использую функцию, возвращаемое значение type равно T | T[], и оно должно быть T или T[] на основе данных.

Моя вспомогательная функция

import { useQuery } from '@apollo/react-hooks';
import { flatMap } from 'lodash';

export default function QueryHelper<T> (document: any, variables?: {}) {
  const { data: responseData, loading, error } = useQuery(document, { variables });

  const object = (): T => responseData;
  const array = (): T[] => flatMap(responseData);
  let data;

  if (flatMap(responseData).length === 1) {
    data = object();
  } else {
    data = array();
  }
  return { data, loading, error };
}

Вызов функции

const objects = QueryHelper<Object>(multipleObjectsDocument); 
const object = QueryHelper<Object>(singleObjectDocument, { id });

типы возврата

const Object: {
    data: Object| Object[]; // This needs to be 1 type
    loading: boolean;
    error: ApolloError | undefined;
}

Основная идея заключается в том, что я могу позвонить, например;

const name = object.data.name';
const listOfName = objects.data.map(obj => obj.name);

Теперь я получаю следующую ошибку Property 'map' does not exist on type 'Object | Object[]'.

Я также попытался условно вернуть различные переменные, основываясь на операторе if, но это возвращает;

const Object: {
    object: Object;
    loading: boolean;
    error: ApolloError | undefined;
} | {
    array: Object[];
    loading: boolean;
    error: ApolloError | undefined;
}

1 Ответ

0 голосов
/ 12 января 2020

Просто исправил, я переосмыслил ..

export default function QueryHelper<T> (document: any, variables?: {}): queryResponse<T> {
  const { data: responseData, loading, error } = useQuery(document, { variables });
  let data = responseData ?? [];

  const array = flatMap(data);

  if (!loading && array.length === 1) {
    data = array[0];
  } else {
    data = array;
  }

  return { data, loading, error };
}

звонки

const objects = QueryHelper<Object[]>(MultipleObjectsDocument).data; // returns type Object[]
const object = QueryHelper<Object>(ObjectDocument, { id }).data; // returns type Object
...