如何从函数 return 单一类型
How to return single type from function
我正在尝试在 Typescript (React) 中构建一个辅助函数。我根据响应数据定义了一个 return a object
或 object[]
的函数。
现在,当我使用该函数时,return 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 });
return 类型
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 语句有条件地 return 不同的变量,但是这个 returns;
const Object: {
object: Object;
loading: boolean;
error: ApolloError | undefined;
} | {
array: Object[];
loading: boolean;
error: ApolloError | undefined;
}
刚修好了。
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
我正在尝试在 Typescript (React) 中构建一个辅助函数。我根据响应数据定义了一个 return a object
或 object[]
的函数。
现在,当我使用该函数时,return 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 });
return 类型
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 语句有条件地 return 不同的变量,但是这个 returns;
const Object: {
object: Object;
loading: boolean;
error: ApolloError | undefined;
} | {
array: Object[];
loading: boolean;
error: ApolloError | undefined;
}
刚修好了。
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