A função axiosGet
:
export const axiosGet = async <TData>({
url,
params = {},
onDone,
onError
}: TypeAxiosArgs<TData>) => {
try {
const r = await axios.get<TypeAxiosData<TData, typeof params.paginate>>(url, { params })
let ret
if (params?.paginate) {
ret = r.data
} else {
ret = r.data.data // <--- causing typescript to scream, check below
}
onDone?.(ret)
return ret
} catch (e) {
console.error(e)
onError?.(e)
}
}
Os tipos:
export type TypeAxiosArgs<TData> = {
url: string
params?: { paginate?: number } & Record<string, any>
onDone?: (response: TypeAxiosData<TData, undefined>) => void
onError?: (error: any) => void
}
export type TypeAxiosData<
TData,
TPaginate extends number | undefined
> = TPaginate extends undefined
? TData
: {
data: TData
meta: {
from: number
to: number
total: number
last_page: number
}
}
Estou recebendo um erro r.data.data
se params.paginate
for indefinido
Property 'data' does not exist on type 'TypeAxiosData<TData, number | undefined>'.
Property 'data' does not exist on type 'TData'.ts(2339)
Sinto que o problema está no axios.get
genérico, que precisa ser algo diferente, mas não consigo descobrir o quê.
Editar: TypeAxiosData corrigido e tentativa de conversão manual.
export const axiosGet = async <TData>({
url,
params = {},
onDone,
onError
}: TypeAxiosArgs<TData>) => {
try {
const r = await axios.get<TypeAxiosData<TData, typeof params.paginate>>(url, { params })
let ret
if (params?.paginate) {
ret = r.data as TypeAxiosData<TData, number>
} else {
ret = r.data.data as TypeAxiosData<TData, undefined>
}
onDone?.(ret)
return ret
} catch (e) {
console.error(e)
onError?.(e)
}
}
axiosGet<{ id: number, name: string }>({ url: "", params: { paginate: undefined } })
.then((result) => {})
O problema que estou tendo é que o tipo de resultado está sendo declarado como:
(parameter) result: {
id: number;
name: string;
} | {
data: {
id: number;
name: string;
};
meta: {
from: number;
to: number;
total: number;
last_page: number;
};
} | undefined
Em vez de:
(parameter) result: {
id: number;
name: string;
} | undefined