Skip to content

Commit 33ef53b

Browse files
committed
fix: useUn narrow type of data when initialValue is provided, https://github.com/vueuse/vueuse/pull/4419/files
1 parent 71ee1b8 commit 33ef53b

File tree

1 file changed

+83
-22
lines changed

1 file changed

+83
-22
lines changed

packages/core/src/composables.ts

Lines changed: 83 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,18 @@ import type {
1010
} from "./index";
1111
import { UnError, un } from "./index";
1212

13-
/** Align with v10.8.0 */
13+
/** Align with v12.3.0 */
1414

15-
export interface UseUnReturn<T = UnData, R = UnResponse<T>, D = UnData> {
15+
export interface UseUnReturn<
16+
T = UnData,
17+
R = UnResponse<T>,
18+
D = UnData,
19+
O extends UseUnOptions<T> = UseUnOptions<T>,
20+
> {
1621
/** Un 响应 */
1722
response: ShallowRef<R | undefined>;
1823
/** Un 响应数据 */
19-
data: Ref<T | undefined>;
24+
data: O extends UseUnOptionsWithInitialData<T> ? Ref<T> : Ref<T | undefined>;
2025
/** 是否已经结束 */
2126
isFinished: Ref<boolean>;
2227
/** 是否正在请求 */
@@ -32,12 +37,17 @@ export interface UseUnReturn<T = UnData, R = UnResponse<T>, D = UnData> {
3237
/** `abort` 别名 */
3338
cancel: (message?: string | undefined) => void;
3439
}
35-
export interface StrictUseUnReturn<T, R, D> extends UseUnReturn<T, R, D> {
40+
export interface StrictUseUnReturn<
41+
T,
42+
R,
43+
D,
44+
O extends UseUnOptions<T> = UseUnOptions<T>,
45+
> extends UseUnReturn<T, R, D, O> {
3646
/** 手动调用 */
3747
execute: (
3848
url?: string | UnConfig<T, D>,
3949
config?: UnConfig<T, D>,
40-
) => Promise<StrictUseUnReturn<T, R, D>>;
50+
) => Promise<StrictUseUnReturn<T, R, D, O>>;
4151
}
4252
export interface EasyUseUnReturn<T, R, D> extends UseUnReturn<T, R, D> {
4353
/** 手动调用 */
@@ -46,7 +56,7 @@ export interface EasyUseUnReturn<T, R, D> extends UseUnReturn<T, R, D> {
4656
config?: UnConfig<T, D>,
4757
) => Promise<EasyUseUnReturn<T, R, D>>;
4858
}
49-
export interface UseUnOptions<T = UnData> {
59+
export interface UseUnOptionsBase<T = UnData> {
5060
/** 当 `useUn` 被调用时,是否自动发起请求 */
5161
immediate?: boolean;
5262
/**
@@ -61,8 +71,6 @@ export interface UseUnOptions<T = UnData> {
6171
* @default true
6272
*/
6373
abortPrevious?: boolean;
64-
/** 在请求还未响应时使用的响应数据 */
65-
initialData?: T;
6674
/**
6775
* 是否在执行前将请求数据重置为 initialData
6876
*
@@ -76,41 +84,94 @@ export interface UseUnOptions<T = UnData> {
7684
/** 请求结束时调用 */
7785
onFinish?: () => void;
7886
}
87+
export interface UseUnOptionsWithInitialData<T> extends UseUnOptionsBase<T> {
88+
/** 在请求还未响应时使用的响应数据 */
89+
initialData: T;
90+
}
91+
export type UseUnOptions<T = UnData> =
92+
| UseUnOptionsBase<T>
93+
| UseUnOptionsWithInitialData<T>;
7994
type OverallUseUnReturn<T, R, D> =
8095
| StrictUseUnReturn<T, R, D>
8196
| EasyUseUnReturn<T, R, D>;
8297

8398
const isUnInstance = (val: any) =>
8499
!!val?.request && !!val?.download && !!val?.upload;
85100

86-
export function useUn<T = UnData, R = UnResponse<T>, D = UnData>(
101+
export function useUn<
102+
T = UnData,
103+
R = UnResponse<T>,
104+
D = UnData,
105+
O extends UseUnOptionsWithInitialData<T> = UseUnOptionsWithInitialData<T>,
106+
>(
87107
url: string,
88108
config?: UnConfig<T, D>,
89-
options?: UseUnOptions<T>,
90-
): StrictUseUnReturn<T, R, D> & Promise<StrictUseUnReturn<T, R, D>>;
91-
export function useUn<T = any, R = UnResponse<T>, D = any>(
109+
options?: O,
110+
): StrictUseUnReturn<T, R, D, O> & Promise<StrictUseUnReturn<T, R, D, O>>;
111+
export function useUn<
112+
T = UnData,
113+
R = UnResponse<T>,
114+
D = UnData,
115+
O extends UseUnOptionsWithInitialData<T> = UseUnOptionsWithInitialData<T>,
116+
>(
92117
url: string,
93118
instance?: UnInstance,
94-
options?: UseUnOptions<T>,
95-
): StrictUseUnReturn<T, R, D> & Promise<StrictUseUnReturn<T, R, D>>;
96-
export function useUn<T = any, R = UnResponse<T>, D = any>(
119+
options?: O,
120+
): StrictUseUnReturn<T, R, D, O> & Promise<StrictUseUnReturn<T, R, D, O>>;
121+
export function useUn<
122+
T = UnData,
123+
R = UnResponse<T>,
124+
D = UnData,
125+
O extends UseUnOptionsWithInitialData<T> = UseUnOptionsWithInitialData<T>,
126+
>(
97127
url: string,
98128
config: UnConfig<T, D>,
99129
instance: UnInstance,
100-
options?: UseUnOptions<T>,
101-
): StrictUseUnReturn<T, R, D> & Promise<StrictUseUnReturn<T, R, D>>;
102-
export function useUn<T = any, R = UnResponse<T>, D = any>(
130+
options?: O,
131+
): StrictUseUnReturn<T, R, D, O> & Promise<StrictUseUnReturn<T, R, D, O>>;
132+
export function useUn<
133+
T = UnData,
134+
R = UnResponse<T>,
135+
D = UnData,
136+
O extends UseUnOptionsBase<T> = UseUnOptionsBase<T>,
137+
>(
138+
url: string,
139+
config?: UnConfig<T, D>,
140+
options?: O,
141+
): StrictUseUnReturn<T, R, D, O> & Promise<StrictUseUnReturn<T, R, D, O>>;
142+
export function useUn<
143+
T = UnData,
144+
R = UnResponse<T>,
145+
D = UnData,
146+
O extends UseUnOptionsBase<T> = UseUnOptionsBase<T>,
147+
>(
148+
url: string,
149+
instance?: UnInstance,
150+
options?: O,
151+
): StrictUseUnReturn<T, R, D, O> & Promise<StrictUseUnReturn<T, R, D, O>>;
152+
export function useUn<
153+
T = UnData,
154+
R = UnResponse<T>,
155+
D = UnData,
156+
O extends UseUnOptionsBase<T> = UseUnOptionsBase<T>,
157+
>(
158+
url: string,
159+
config: UnConfig<T, D>,
160+
instance: UnInstance,
161+
options?: O,
162+
): StrictUseUnReturn<T, R, D, O> & Promise<StrictUseUnReturn<T, R, D, O>>;
163+
export function useUn<T = UnData, R = UnResponse<T>, D = UnData>(
103164
config?: UnConfig<T, D>,
104165
): EasyUseUnReturn<T, R, D> & Promise<EasyUseUnReturn<T, R, D>>;
105-
export function useUn<T = any, R = UnResponse<T>, D = any>(
166+
export function useUn<T = UnData, R = UnResponse<T>, D = UnData>(
106167
instance?: UnInstance,
107168
): EasyUseUnReturn<T, R, D> & Promise<EasyUseUnReturn<T, R, D>>;
108-
export function useUn<T = any, R = UnResponse<T>, D = any>(
169+
export function useUn<T = UnData, R = UnResponse<T>, D = UnData>(
109170
config?: UnConfig<T, D>,
110171
instance?: UnInstance,
111172
): EasyUseUnReturn<T, R, D> & Promise<EasyUseUnReturn<T, R, D>>;
112173

113-
export function useUn<T = any, R = UnResponse<T>, D = any>(
174+
export function useUn<T = UnData, R = UnResponse<T>, D = UnData>(
114175
...args: any[]
115176
): OverallUseUnReturn<T, R, D> & Promise<OverallUseUnReturn<T, R, D>> {
116177
const url: string | undefined =
@@ -144,14 +205,14 @@ export function useUn<T = any, R = UnResponse<T>, D = any>(
144205
options = args.at(-1) || options;
145206

146207
const {
147-
initialData,
148208
shallow,
149209
onSuccess = noop,
150210
onError = noop,
151211
immediate,
152212
resetOnExecute = false,
153213
} = options;
154214

215+
const initialData = (options as UseUnOptionsWithInitialData<T>).initialData;
155216
const response = shallowRef<UnResponse<T, D>>();
156217
const data = (shallow ? shallowRef : ref)(initialData) as Ref<T | undefined>;
157218
const isFinished = ref(false);

0 commit comments

Comments
 (0)