Skip to content

Commit d23653c

Browse files
committed
feat(types): any replaces unknown as the response type when using js
1 parent 65c7e6b commit d23653c

File tree

4 files changed

+102
-5
lines changed

4 files changed

+102
-5
lines changed

src/request.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,14 @@ export type Request<
3333
K3 extends keyof T[K1][K2] = any,
3434
> = (...args: any[]) => Resource<T, D, K1, K2, K3>;
3535

36+
type _AnyKeyValue<T, K> = K extends keyof T ? T[K] : any;
37+
3638
export type Payload<T extends Request, Check = false> = Check extends true
37-
? ReturnType<T>["_payload_item"]
39+
? _AnyKeyValue<ReturnType<T>, "_payload_item">
3840
: T extends Request<AxiosResponse>
39-
? NonNullable<ReturnType<T>["_payload"]>
40-
: ReturnType<T>["_payload"];
41-
export type BodyData<T extends Request> = ReturnType<T>["data"];
41+
? Exclude<_AnyKeyValue<ReturnType<T>, "_payload">, undefined>
42+
: _AnyKeyValue<ReturnType<T>, "_payload">;
43+
export type BodyData<T extends Request> = _AnyKeyValue<ReturnType<T>, "data">;
4244

4345
export interface RequestFactory<T extends Request> {
4446
(...args: Parameters<T>): {
@@ -95,7 +97,7 @@ export function _request<
9597
/**
9698
* For TypeScript type deduction
9799
*/
98-
export const request = <T, D = any>(config: AxiosRequestConfig<D>) =>
100+
export const request = <T = any, D = any>(config: AxiosRequestConfig<D>) =>
99101
_request<AxiosResponse<T, D>, D>(config);
100102

101103
export function createRequestError<

tests/setup/mock-request.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,19 @@ export const getAPIFuncs = (widthBaseUrl?: boolean) => {
6565
method: "get",
6666
url: "/users",
6767
}),
68+
// for type checking
69+
anyTypeList: () => ({
70+
baseURL,
71+
method: "get",
72+
url: "/users",
73+
}),
74+
// for type checking
75+
anyTypeWithoutGenericityList: () =>
76+
request({
77+
baseURL,
78+
method: "get",
79+
url: "/users",
80+
}),
6881
get: (params?: { id: string }) =>
6982
request<MockDataUserItem>({
7083
baseURL,

tests/useRequest.test.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,45 @@ describe("useRequest", () => {
2929
expect(response.status).toBe(200);
3030
});
3131

32+
test("any type (without `request`)", async () => {
33+
const [createRequest] = useRequest(getAPIFuncs(true).user.anyTypeList, {
34+
onCompleted(data, response) {
35+
expectTypeOf(data).toEqualTypeOf<any>();
36+
expectTypeOf(response).toEqualTypeOf<any>();
37+
expect(data).toStrictEqual(MOCK_DATA_USER_LIST);
38+
expect(response.data).toStrictEqual(MOCK_DATA_USER_LIST);
39+
},
40+
});
41+
42+
const [data, response] = await createRequest().ready();
43+
expect(data).toStrictEqual(MOCK_DATA_USER_LIST);
44+
expect(response.data).toStrictEqual(MOCK_DATA_USER_LIST);
45+
expect(response.status).toBe(200);
46+
expectTypeOf(data).toEqualTypeOf<any>();
47+
expectTypeOf(response).toEqualTypeOf<any>();
48+
});
49+
50+
test("any type (`request` without genericity)", async () => {
51+
const [createRequest] = useRequest(
52+
getAPIFuncs(true).user.anyTypeWithoutGenericityList,
53+
{
54+
onCompleted(data, response) {
55+
expectTypeOf(data).toEqualTypeOf<any>();
56+
expectTypeOf(response).toEqualTypeOf<AxiosResponse<any>>();
57+
expect(data).toStrictEqual(MOCK_DATA_USER_LIST);
58+
expect(response.data).toStrictEqual(MOCK_DATA_USER_LIST);
59+
},
60+
},
61+
);
62+
63+
const [data, response] = await createRequest().ready();
64+
expect(data).toStrictEqual(MOCK_DATA_USER_LIST);
65+
expect(response.data).toStrictEqual(MOCK_DATA_USER_LIST);
66+
expect(response.status).toBe(200);
67+
expectTypeOf(data).toEqualTypeOf<any>();
68+
expectTypeOf(response).toEqualTypeOf<AxiosResponse<any>>();
69+
});
70+
3271
test("check createRequest", async () => {
3372
const Component = defineComponent({
3473
setup() {

tests/useResource.test.ts

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,49 @@ describe("useResource", () => {
8282
expect(wrapper.get('[data-t-id="res.isLoading"]').text()).toBe("false");
8383
});
8484

85+
test("any type (without `request`)", async () => {
86+
defineComponent({
87+
setup() {
88+
const [res] = useResource(getAPIFuncs(true).user.anyTypeList, false, {
89+
onCompleted: (d, r) => {
90+
expectTypeOf(d).toEqualTypeOf<any>();
91+
expectTypeOf(r).toEqualTypeOf<any>();
92+
},
93+
});
94+
95+
const _unref_res = unref(res);
96+
97+
expectTypeOf(_unref_res.data).toEqualTypeOf<any>();
98+
expectTypeOf(_unref_res.response).toEqualTypeOf<any>();
99+
return () => h("div");
100+
},
101+
});
102+
});
103+
test("any type (`request` without genericity)", async () => {
104+
defineComponent({
105+
setup() {
106+
const [res] = useResource(
107+
getAPIFuncs(true).user.anyTypeWithoutGenericityList,
108+
false,
109+
{
110+
onCompleted: (d, r) => {
111+
expectTypeOf(d).toEqualTypeOf<any>();
112+
expectTypeOf(r).toEqualTypeOf<AxiosResponse<any>>();
113+
},
114+
},
115+
);
116+
117+
const _unref_res = unref(res);
118+
119+
expectTypeOf(_unref_res.data).toEqualTypeOf<any>();
120+
expectTypeOf(_unref_res.response).toEqualTypeOf<
121+
AxiosResponse<any> | undefined
122+
>();
123+
return () => h("div");
124+
},
125+
});
126+
});
127+
85128
test("options: filter", async () => {
86129
const Component = defineComponent({
87130
setup() {

0 commit comments

Comments
 (0)