Skip to content

Commit

Permalink
fix: the type issue of useForm and shared package
Browse files Browse the repository at this point in the history
  • Loading branch information
MeetinaXD committed Oct 22, 2024
1 parent 53de6fb commit 41546eb
Show file tree
Hide file tree
Showing 25 changed files with 138 additions and 95 deletions.
5 changes: 5 additions & 0 deletions .changeset/funny-meals-ring.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@alova/shared': patch
---

fix: correct incorrect reference paths after `shared` package build
5 changes: 5 additions & 0 deletions .changeset/loud-eggs-listen.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'alova': patch
---

fix: correct type inconsistency between the form arg of handler and initialData in `useForm`
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ export declare function actionDelegationMiddleware<
context: (AlovaFrontMiddlewareContext<AG, Args> | AlovaFetcherMiddlewareContext<AG, Args>) & {
delegatingActions?: Actions;
},
next: AlovaGuardNext<AG>
next: AlovaGuardNext<AG, Args>
) => Promise<any>;

/**
Expand Down
6 changes: 3 additions & 3 deletions packages/alova/typings/clienthook/hooks/useAutoRequest.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { RequestHookConfig } from './useRequest';
/**
* useAutoRequest配置
*/
export type AutoRequestHookConfig<AG extends AlovaGenerics> = {
export type AutoRequestHookConfig<AG extends AlovaGenerics, Args extends any[] = any[]> = {
/**
* 轮询事件,单位ms,0表示不开启
* @default 0
Expand All @@ -31,7 +31,7 @@ export type AutoRequestHookConfig<AG extends AlovaGenerics> = {
* @default 1000
*/
throttle?: number;
} & RequestHookConfig<AG>;
} & RequestHookConfig<AG, Args>;

export type NotifyHandler = () => void;
export type UnbindHandler = () => void;
Expand All @@ -49,7 +49,7 @@ export type UnbindHandler = () => void;
*/
export declare function useAutoRequest<AG extends AlovaGenerics, Args extends any[] = any[]>(
handler: Method<AG> | AlovaMethodHandler<AG, Args>,
config?: AutoRequestHookConfig<AG>
config?: AutoRequestHookConfig<AG, Args>
): UseHookExposure<AG, Args>;
export declare namespace useAutoRequest {
function onNetwork<AG extends AlovaGenerics = AlovaGenerics>(
Expand Down
6 changes: 3 additions & 3 deletions packages/alova/typings/clienthook/hooks/useCaptcha.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@ import { RequestHookConfig } from './useRequest';
/**
* useCaptcha配置
*/
export type CaptchaHookConfig<AG extends AlovaGenerics> = {
export type CaptchaHookConfig<AG extends AlovaGenerics, Args extends any[] = any[]> = {
/**
* 初始倒计时,当验证码发送成功时将会以此数据来开始倒计时
* @default 60
*/
initialCountdown?: number;
} & RequestHookConfig<AG>;
} & RequestHookConfig<AG, Args>;

/**
* useCaptcha返回值
Expand All @@ -32,5 +32,5 @@ export interface CaptchaExposure<AG extends AlovaGenerics, Args extends any[] =
*/
export declare function useCaptcha<AG extends AlovaGenerics, Args extends any[] = any[]>(
handler: Method<AG> | AlovaMethodHandler<AG, Args>,
config?: CaptchaHookConfig<AG>
config?: CaptchaHookConfig<AG, Args>
): CaptchaExposure<AG, Args>;
6 changes: 3 additions & 3 deletions packages/alova/typings/clienthook/hooks/useForm.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ export interface StoreDetailConfig {
*/
serializers?: Record<string | number, DataSerializer>;
}
export type FormHookConfig<AG extends AlovaGenerics, FormData> = {
export type FormHookConfig<AG extends AlovaGenerics, FormData, Args extends any[]> = {
/**
* 初始表单数据
*/
Expand All @@ -56,7 +56,7 @@ export type FormHookConfig<AG extends AlovaGenerics, FormData> = {
* @default false
*/
resetAfterSubmiting?: boolean;
} & RequestHookConfig<AG>;
} & RequestHookConfig<AG, Args>;

export type RestoreHandler = () => void;
/**
Expand Down Expand Up @@ -104,5 +104,5 @@ export declare function useForm<
Args extends any[] = any[]
>(
handler: FormHookHandler<AG, FormData, Args>,
config?: FormHookConfig<AG, FormData>
config?: FormHookConfig<AG, FormData, Args>
): FormExposure<AG, FormData, Args>;
8 changes: 4 additions & 4 deletions packages/alova/typings/clienthook/hooks/usePagination.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -82,14 +82,14 @@ export interface UsePaginationExposure<AG extends AlovaGenerics, ListData extend
fetching: ExportedState<boolean, AG['StatesExport']>;
onFetchSuccess(
handler: SuccessHandler<AG, [page: number, pageSize: number, ...Args]>
): UsePaginationExposure<AG, ListData>;
): UsePaginationExposure<AG, ListData, Args>;
onFetchError(
handler: ErrorHandler<AG, [page: number, pageSize: number, ...Args]>
): UsePaginationExposure<AG, ListData>;
): UsePaginationExposure<AG, ListData, Args>;
onFetchComplete(
handler: CompleteHandler<AG, [page: number, pageSize: number, ...Args]>
): UsePaginationExposure<AG, ListData>;
update: StateUpdater<UsePaginationExposure<AG, ListData>, AG['StatesExport']>;
): UsePaginationExposure<AG, ListData, Args>;
update: StateUpdater<UsePaginationExposure<AG, ListData, Args>, AG['StatesExport']>;

/**
* 刷新指定页码数据,此函数将忽略缓存强制发送请求
Expand Down
4 changes: 2 additions & 2 deletions packages/alova/typings/clienthook/hooks/useRetriable.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ export interface RetriableExposure<AG extends AlovaGenerics, Args extends any[]
* 它们将在重试发起后触发
* @param handler 重试事件回调
*/
onRetry(handler: (event: RetriableRetryEvent<AG>) => void): this;
onRetry(handler: (event: RetriableRetryEvent<AG, Args>) => void): this;

/**
* 失败事件绑定
Expand All @@ -70,7 +70,7 @@ export interface RetriableExposure<AG extends AlovaGenerics, Args extends any[]
*
* @param handler 失败事件回调
*/
onFail(handler: (event: RetriableFailEvent<AG>) => void): this;
onFail(handler: (event: RetriableFailEvent<AG, Args>) => void): this;
}

/**
Expand Down
50 changes: 30 additions & 20 deletions packages/alova/typings/clienthook/hooks/useSQRequest.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -78,28 +78,31 @@ export interface GlobalSQFailEvent<AG extends AlovaGenerics> extends GlobalSQEve
}

/** SQ局部事件 */
export interface ScopedSQEvent<AG extends AlovaGenerics, Args extends any[]> extends SQEvent<AG> {
export interface ScopedSQEvent<AG extends AlovaGenerics, Args extends any[] = any[]> extends SQEvent<AG> {
/**
* 通过send触发请求时传入的参数
*/
args: [...Args, ...any[]];
}
/** 局部成功事件 */
export interface ScopedSQSuccessEvent<AG extends AlovaGenerics, Args extends any[]> extends ScopedSQEvent<AG, Args> {
export interface ScopedSQSuccessEvent<AG extends AlovaGenerics, Args extends any[] = any[]>
extends ScopedSQEvent<AG, Args> {
/**
* 响应数据
*/
data: AG['Responded'];
}
/** 局部失败事件 */
export interface ScopedSQErrorEvent<AG extends AlovaGenerics, Args extends any[]> extends ScopedSQEvent<AG, Args> {
export interface ScopedSQErrorEvent<AG extends AlovaGenerics, Args extends any[] = any[]>
extends ScopedSQEvent<AG, Args> {
/**
* 失败时抛出的错误
*/
error: any;
}
/** 局部失败事件 */
export interface ScopedSQRetryEvent<AG extends AlovaGenerics, Args extends any[]> extends ScopedSQEvent<AG, Args> {
export interface ScopedSQRetryEvent<AG extends AlovaGenerics, Args extends any[] = any[]>
extends ScopedSQEvent<AG, Args> {
/**
* 重试次数
*/
Expand All @@ -110,11 +113,12 @@ export interface ScopedSQRetryEvent<AG extends AlovaGenerics, Args extends any[]
retryDelay: number;
}
/** 局部完成事件 */
export interface ScopedSQCompleteEvent<AG extends AlovaGenerics, Args extends any[]> extends ScopedSQEvent<AG, Args> {
export interface ScopedSQCompleteEvent<AG extends AlovaGenerics, Args extends any[] = any[]>
extends ScopedSQEvent<AG, Args> {
/**
* 响应状态
*/
status: AlovaCompleteEvent<AG>['status'];
status: AlovaCompleteEvent<AG, Args>['status'];
/**
* 响应数据
*/
Expand Down Expand Up @@ -348,14 +352,20 @@ export interface SQHookConfig<AG extends AlovaGenerics> {
vDataCaptured?: (method: Method<AG>) => AG['Responded'] | undefined | void;
}

export type SQRequestHookConfig<AG extends AlovaGenerics, Args extends any[]> = SQHookConfig<AG> &
export type SQRequestHookConfig<AG extends AlovaGenerics, Args extends any[] = any[]> = SQHookConfig<AG> &
RequestHookConfig<AG, Args>;
export type FallbackHandler<AG extends AlovaGenerics> = (event: ScopedSQEvent<AG>) => void;
export type RetryHandler<AG extends AlovaGenerics> = (event: ScopedSQRetryEvent<AG>) => void;
export type BeforePushQueueHandler<AG extends AlovaGenerics> = (
event: ScopedSQEvent<AG>
export type FallbackHandler<AG extends AlovaGenerics, Args extends any[] = any[]> = (
event: ScopedSQEvent<AG, Args>
) => void;
export type RetryHandler<AG extends AlovaGenerics, Args extends any[] = any[]> = (
event: ScopedSQRetryEvent<AG, Args>
) => void;
export type BeforePushQueueHandler<AG extends AlovaGenerics, Args extends any[] = any[]> = (
event: ScopedSQEvent<AG, Args>
) => void | boolean | Promise<void | boolean>;
export type PushedQueueHandler<AG extends AlovaGenerics> = (event: ScopedSQEvent<AG>) => void;
export type PushedQueueHandler<AG extends AlovaGenerics, Args extends any[] = any[]> = (
event: ScopedSQEvent<AG, Args>
) => void;
export type SQHookExposure<AG extends AlovaGenerics, Args extends any[] = any[]> = Omit<
UseHookExposure<AG, Args>,
'onSuccess' | 'onError' | 'onComplete'
Expand All @@ -372,25 +382,25 @@ export type SQHookExposure<AG extends AlovaGenerics, Args extends any[] = any[]>
* 1. 只在重试次数达到后仍然失败时触发
* 2. 在onComplete之前触发
*/
onFallback(handler: FallbackHandler<AG>): SQHookExposure<AG>;
onFallback(handler: FallbackHandler<AG, Args>): SQHookExposure<AG>;

/** 在入队列前调用,在此可以过滤队列中重复的SilentMethod,在static行为下无效 */
onBeforePushQueue(handler: BeforePushQueueHandler<AG>): SQHookExposure<AG>;
onBeforePushQueue(handler: BeforePushQueueHandler<AG, Args>): SQHookExposure<AG>;

/** 在入队列后调用,在static行为下无效 */
onPushedQueue(handler: PushedQueueHandler<AG>): SQHookExposure<AG>;
onPushedQueue(handler: PushedQueueHandler<AG, Args>): SQHookExposure<AG>;

/** 重试事件绑定 */
onRetry(handler: RetryHandler<AG>): SQHookExposure<AG>;
onRetry(handler: RetryHandler<AG, Args>): SQHookExposure<AG>;

/** @override 重写alova的onSuccess事件 */
onSuccess(handler: (event: ScopedSQSuccessEvent<AG>) => void): SQHookExposure<AG>;
onSuccess(handler: (event: ScopedSQSuccessEvent<AG, Args>) => void): SQHookExposure<AG>;

/** @override 重写alova的onError事件 */
onError(handler: (event: ScopedSQErrorEvent<AG>) => void): SQHookExposure<AG>;
onError(handler: (event: ScopedSQErrorEvent<AG, Args>) => void): SQHookExposure<AG>;

/** @override 重写alova的onComplete事件 */
onComplete(handler: (event: ScopedSQCompleteEvent<AG>) => void): SQHookExposure<AG>;
onComplete(handler: (event: ScopedSQCompleteEvent<AG, Args>) => void): SQHookExposure<AG>;
};

export interface DataSerializer {
Expand Down Expand Up @@ -461,7 +471,7 @@ export type SilentQueueMap = Record<string, SilentMethod<any>[]>;
*/
export declare function useSQRequest<AG extends AlovaGenerics, Args extends any[] = any[]>(
handler: AlovaMethodHandler<AG, Args>,
config?: SQRequestHookConfig<AG>
config?: SQRequestHookConfig<AG, Args>
): SQHookExposure<AG, Args>;
export declare function bootSilentFactory(options: SilentFactoryBootOptions): void;
export declare function onSilentSubmitBoot(handler: SilentSubmitBootHandler): OffEventCallback;
Expand Down
14 changes: 7 additions & 7 deletions packages/alova/typings/clienthook/hooks/useSerialRequest.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import { RequestHookConfig } from './useRequest';
*/
export declare function useSerialRequest<AG extends AlovaGenerics, Args extends any[] = any[]>(
serialHandlers: [Method<AG> | AlovaMethodHandler<AG, Args>, ...AlovaMethodHandler<any>[]],
config?: RequestHookConfig<AG>
config?: RequestHookConfig<AG, Args>
): UseHookExposure<AG, Args>;

/**
Expand All @@ -29,7 +29,7 @@ export declare function useSerialRequest<
Args extends any[] = any[]
>(
serialHandlers: [Method<AG> | AlovaMethodHandler<AG, Args>, AlovaMethodHandler<AG2>, ...AlovaMethodHandler<any>[]],
config?: RequestHookConfig<AG>
config?: RequestHookConfig<AG, Args>
): UseHookExposure<AG2, Args>;

/**
Expand All @@ -52,7 +52,7 @@ export declare function useSerialRequest<
AlovaMethodHandler<AG3>,
...AlovaMethodHandler<any>[]
],
config?: RequestHookConfig<AG>
config?: RequestHookConfig<AG, Args>
): UseHookExposure<AG3, Args>;

/**
Expand All @@ -77,7 +77,7 @@ export declare function useSerialRequest<
AlovaMethodHandler<AG4>,
...AlovaMethodHandler<any>[]
],
config?: RequestHookConfig<AG>
config?: RequestHookConfig<AG, Args>
): UseHookExposure<AG4, Args>;

/**
Expand All @@ -104,7 +104,7 @@ export declare function useSerialRequest<
AlovaMethodHandler<AG5>,
...AlovaMethodHandler<any>[]
],
config?: RequestHookConfig<AG>
config?: RequestHookConfig<AG, Args>
): UseHookExposure<AG5, Args>;

/**
Expand Down Expand Up @@ -133,7 +133,7 @@ export declare function useSerialRequest<
AlovaMethodHandler<AG6>,
...AlovaMethodHandler<any>[]
],
config?: RequestHookConfig<AG>
config?: RequestHookConfig<AG, Args>
): UseHookExposure<AG6, Args>;

/**
Expand Down Expand Up @@ -164,5 +164,5 @@ export declare function useSerialRequest<
AlovaMethodHandler<AG7>,
...AlovaMethodHandler<any>[]
],
config?: RequestHookConfig<AG>
config?: RequestHookConfig<AG, Args>
): UseHookExposure<AG7, Args>;
2 changes: 1 addition & 1 deletion packages/client/src/hooks/useAutoRequest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ const useAutoRequest: AutoRequestHook = (handler, config = {}) => {
offVisiblity();
offPolling();
});
return states;
return states as any;
};

const on = (type: string, handler: NotifyHandler) => {
Expand Down
2 changes: 1 addition & 1 deletion packages/client/src/hooks/useCaptcha.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ const hookPrefix = 'useCaptcha';
const captchaAssert = createAssert(hookPrefix);
export default <AG extends AlovaGenerics, Args extends any[] = any[]>(
handler: Method<AG> | AlovaMethodHandler<AG, Args>,
config: CaptchaHookConfig<AG> = {}
config: CaptchaHookConfig<AG, Args> = {}
) => {
const { initialCountdown, middleware } = config;
captchaAssert(initialCountdown === undefinedValue || initialCountdown > 0, 'initialCountdown must be greater than 0');
Expand Down
6 changes: 3 additions & 3 deletions packages/client/src/hooks/useForm.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import { FormExposure, FormHookConfig, FormHookHandler, RestoreHandler, StoreDet
const RestoreEventKey = Symbol('FormRestore');
const getStoragedKey = <AG extends AlovaGenerics>(methodInstance: Method<AG>, id?: ID) =>
`alova/form-${id || getMethodInternalKey(methodInstance)}`;
type ID = NonNullable<FormHookConfig<AlovaGenerics, any>['id']>;
type ID = NonNullable<FormHookConfig<AlovaGenerics, any, any[]>['id']>;

const sharedStates = {};
const cloneFormData = <T>(form: T): T => {
Expand All @@ -27,13 +27,13 @@ const cloneFormData = <T>(form: T): T => {

export default <AG extends AlovaGenerics, FormData extends Record<string | symbol, any>, Args extends any[] = any[]>(
handler: FormHookHandler<AG, FormData, Args>,
config: FormHookConfig<AG, FormData> = {}
config: FormHookConfig<AG, FormData, Args> = {}
): FormExposure<AG, FormData, Args> => {
const typedSharedStates = sharedStates as Record<
ID,
{
hookProvider: FormExposure<AG, any, Args>;
config: FormHookConfig<AG, any>;
config: FormHookConfig<AG, any, Args>;
}
>;

Expand Down
14 changes: 13 additions & 1 deletion packages/client/test/type/exposure.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,19 @@ describe('send args', () => {
});

test('useForm', () => {
const useFormState = useForm((form: {}, ...args: Args) => VueAlovaInst.Get('/unit-test'));
interface Info {
name: string;
age: number;
}
const useFormState = useForm(
(form, ...args: Args) => {
expectType<Info>(form);
return VueAlovaInst.Get('/unit-test');
},
{
initialForm: {} as Info
}
);
expectAssignableBy<SendHandler<Args, any>>(useFormState.send);
expectAssignableBy<SendHandler<ExtendedArgs, any>>(useFormState.send);
// @ts-expect-error
Expand Down
2 changes: 1 addition & 1 deletion packages/client/test/vue/useForm.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import { FormHookConfig } from '~/typings/clienthook';
import CompPersistentDataReset from './components/persistent-data-reset.vue';
import CompRestorePersistentData from './components/restore-persistent-data.vue';

type ID = NonNullable<FormHookConfig<AlovaGenerics, any>['id']>;
type ID = NonNullable<FormHookConfig<AlovaGenerics, any, any[]>['id']>;
const getStoragedKey = (methodInstance: Method, id?: ID) => `alova/form-${id || getMethodInternalKey(methodInstance)}`;
const alovaInst = createAlova({
baseURL: 'http://localhost:8080',
Expand Down
3 changes: 2 additions & 1 deletion packages/client/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@
"~/*": ["./*"],
"#/*": ["test/*"],
"root/*": ["../../internal/*"]
}
},
"skipLibCheck": false
},
"include": [
"src/**/*.ts",
Expand Down
Loading

0 comments on commit 41546eb

Please sign in to comment.