Skip to content

Commit 4ad4896

Browse files
committed
feat(request): export _request
for custom response type
1 parent 05e6a14 commit 4ad4896

File tree

4 files changed

+50
-17
lines changed

4 files changed

+50
-17
lines changed

src/request.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export type _ResponseDataItemType<T> = T extends AxiosResponse<infer D1>
1414

1515
export interface Resource<T, D = any, W = AxiosResponse>
1616
extends AxiosRequestConfig<D> {
17-
_payload?: W extends AxiosResponse ? AxiosResponse<T> : T;
17+
_payload?: W extends AxiosResponse ? AxiosResponse<T, D> : T;
1818
}
1919

2020
export type Request<T = any, D = any, W = any> = (
@@ -71,12 +71,19 @@ export type RequestCallbackFn<T extends Request> = {
7171
/**
7272
* For TypeScript type deduction
7373
*/
74-
export function request<T, D = any, W = AxiosResponse>(
74+
export function _request<T, D = any, W = false>(
7575
config: AxiosRequestConfig<D>,
7676
): Resource<T, D, W> {
7777
return config;
7878
}
7979

80+
/**
81+
* For TypeScript type deduction
82+
*/
83+
export const request = <T, D = any, W = AxiosResponse<T, D>>(
84+
config: AxiosRequestConfig<D>,
85+
) => _request<T, D, W>(config);
86+
8087
export function createRequestError<
8188
T = any,
8289
D = any,

tests/request.test.ts

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
import { describe, it, expect } from "vitest";
2-
import type { AxiosRequestConfig } from "axios";
3-
import { request, createRequestError } from "../src";
1+
import { describe, it, expect, expectTypeOf } from "vitest";
2+
import type { AxiosRequestConfig, AxiosResponse } from "axios";
3+
import type { Payload, Resource } from "../src";
4+
import { request, _request, createRequestError } from "../src";
45

56
const config1 = { url: "/config1", method: "GET" } as AxiosRequestConfig;
67
const config2 = {
@@ -62,3 +63,34 @@ describe("createRequestError", () => {
6263
expect(createRequestError({} as any).original).toStrictEqual({});
6364
});
6465
});
66+
67+
describe("type checking", () => {
68+
type DataType = { a: string; b?: number };
69+
type ItemType = { z: string[] };
70+
type DataType2 = DataType & { data?: ItemType };
71+
const rq0 = () => _request<DataType>({});
72+
const rq1 = () => request<DataType>({});
73+
const rq2 = () => _request<DataType2>({});
74+
75+
it("request", () => {
76+
expectTypeOf(rq0()).toEqualTypeOf<Resource<DataType, any, false>>();
77+
expectTypeOf(rq1()).toEqualTypeOf<
78+
Resource<DataType, any, AxiosResponse<DataType, any>>
79+
>();
80+
81+
const c0 = null as unknown as Payload<typeof rq0>;
82+
expectTypeOf(c0).toEqualTypeOf<DataType | undefined>();
83+
const c1 = null as unknown as Payload<typeof rq0, true>;
84+
expectTypeOf(c1).toEqualTypeOf<undefined>();
85+
86+
const c2 = null as unknown as Payload<typeof rq1>;
87+
expectTypeOf(c2).toEqualTypeOf<AxiosResponse<DataType, any> | undefined>();
88+
const c3 = null as unknown as Payload<typeof rq1, true>;
89+
expectTypeOf(c3).toEqualTypeOf<DataType | undefined>();
90+
91+
const c4 = null as unknown as Payload<typeof rq2>;
92+
expectTypeOf(c4).toEqualTypeOf<DataType2 | undefined>();
93+
const c5 = null as unknown as Payload<typeof rq2, true>;
94+
expectTypeOf(c5).toEqualTypeOf<ItemType | undefined>();
95+
});
96+
});

tests/useRequest.test.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { describe, expect, test, vi, expectTypeOf } from "vitest";
22
import { defineComponent, h } from "vue";
3-
import type { AxiosResponse, AxiosRequestConfig } from "axios";
3+
import type { AxiosResponse } from "axios";
44
import axios from "axios";
55

6-
import AxiosUseVue, { useRequest, request } from "../src";
6+
import AxiosUseVue, { useRequest, _request } from "../src";
77
import type { MockDataUserItem } from "./setup/mock-request";
88
import {
99
getAPIFuncs,
@@ -164,12 +164,9 @@ describe("useRequest", () => {
164164
});
165165
_instance.interceptors.response.use((d) => d.data);
166166

167-
const customRequest = <T, D = any>(config: AxiosRequestConfig) =>
168-
request<T, D, false>(config);
169-
170167
const [createRequest] = useRequest(
171168
(id: string) =>
172-
customRequest<MockDataUserItem>({
169+
_request<MockDataUserItem>({
173170
method: "get",
174171
url: `/user/${id}`,
175172
}),

tests/useResource.test.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { describe, expect, test, expectTypeOf } from "vitest";
22
import { mount, flushPromises } from "@vue/test-utils";
3-
import type { AxiosResponse, AxiosRequestConfig } from "axios";
3+
import type { AxiosResponse } from "axios";
44
import { computed, defineComponent, h, ref, unref, reactive } from "vue";
55

6-
import { useResource, request } from "../src";
6+
import { useResource, _request } from "../src";
77
import type { MockDataUserItem } from "./setup/mock-request";
88
import { getAPIFuncs, MOCK_DATA_USER_LIST } from "./setup/mock-request";
99

@@ -245,16 +245,13 @@ describe("useResource", () => {
245245
});
246246

247247
test("types: custom response type", async () => {
248-
const customRequest = <T, D = any>(config: AxiosRequestConfig) =>
249-
request<T, D, false>(config);
250-
251248
const Component = defineComponent({
252249
setup() {
253250
const id = ref("1");
254251

255252
const [res] = useResource(
256253
(i: string) =>
257-
customRequest<MockDataUserItem>({
254+
_request<MockDataUserItem>({
258255
method: "get",
259256
url: `/user/${i}`,
260257
}),

0 commit comments

Comments
 (0)