Skip to content

Commit b2a9b97

Browse files
authored
feat: watch add ts (#416)
* feat: watch add ts * feat: watch add ts * feat: watch add ts * feat: watch add ts * feat: watch add ts * feat: watch add ts * feat: watch add ts * feat: watch add ts * feat: watch add ts * feat: watch add ts * feat: add test * feat: add test * feat: ts
1 parent e283978 commit b2a9b97

File tree

3 files changed

+97
-9
lines changed

3 files changed

+97
-9
lines changed

docs/examples/useWatch.tsx

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,19 @@ import Input from './components/Input';
44

55
let x = 0;
66

7+
type FieldType = {
8+
main?: string;
9+
name?: string;
10+
age?: number;
11+
gender?: boolean;
12+
demo?: string;
13+
demo2?: string;
14+
id?: number;
15+
demo1?: { demo2?: { demo3?: { demo4?: string } } };
16+
};
17+
718
const Demo = React.memo(() => {
8-
const values = Form.useWatch(['demo']);
19+
const values = Form.useWatch<FieldType['demo']>(['demo']);
920
console.log('demo watch', values);
1021
return (
1122
<Field name="demo">
@@ -14,7 +25,7 @@ const Demo = React.memo(() => {
1425
);
1526
});
1627
const Demo2 = React.memo(() => {
17-
const values = Form.useWatch(['demo2']);
28+
const values = Form.useWatch<FieldType['demo2']>(['demo2']);
1829
console.log('demo2 watch', values);
1930
return (
2031
<Field name="demo2">
@@ -24,12 +35,19 @@ const Demo2 = React.memo(() => {
2435
});
2536

2637
export default () => {
27-
const [form] = Form.useForm();
38+
const [form] = Form.useForm<FieldType>();
2839
const [visible, setVisible] = useState(true);
2940
const [visible2, setVisible2] = useState(true);
3041
const [visible3, setVisible3] = useState(true);
31-
const values = Form.useWatch([], form);
32-
console.log('main watch', values);
42+
const main = Form.useWatch('main', form);
43+
const age = Form.useWatch(['age'], form);
44+
const demo1 = Form.useWatch(['demo1'], form);
45+
const demo2 = Form.useWatch(['demo1', 'demo2'], form);
46+
const demo3 = Form.useWatch(['demo1', 'demo2', 'demo3'], form);
47+
const demo4 = Form.useWatch(['demo1', 'demo2', 'demo3', 'demo4'], form);
48+
const demo5 = Form.useWatch(['demo1', 'demo2', 'demo3', 'demo4', 'demo5'], form);
49+
const more = Form.useWatch(['age', 'name', 'gender'], form);
50+
console.log('main watch', demo1, demo2, main, age, demo3, demo4, demo5, more);
3351
return (
3452
<>
3553
<Form

src/useWatch.ts

Lines changed: 45 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,50 @@ import type { InternalFormInstance, NamePath, Store } from './interface';
66
import { useState, useContext, useEffect, useRef } from 'react';
77
import { getNamePath, getValue } from './utils/valueUtil';
88

9-
const useWatch = <ValueType = Store>(dependencies: NamePath = [], form?: FormInstance) => {
10-
const [value, setValue] = useState<ValueType>();
11-
const valueCacheRef = useRef<ValueType>();
9+
type GetGeneric<Type> = Type extends FormInstance<infer ValueType> ? ValueType : never;
10+
11+
function useWatch<
12+
TDependencies1 extends keyof GetGeneric<TForm>,
13+
TForm extends FormInstance,
14+
TDependencies2 extends keyof GetGeneric<TForm>[TDependencies1],
15+
TDependencies3 extends keyof GetGeneric<TForm>[TDependencies1][TDependencies2],
16+
TDependencies4 extends keyof GetGeneric<TForm>[TDependencies1][TDependencies2][TDependencies3],
17+
>(
18+
dependencies: [TDependencies1, TDependencies2, TDependencies3, TDependencies4],
19+
form?: TForm,
20+
): GetGeneric<TForm>[TDependencies1][TDependencies2][TDependencies3][TDependencies4];
21+
22+
function useWatch<
23+
TDependencies1 extends keyof GetGeneric<TForm>,
24+
TForm extends FormInstance,
25+
TDependencies2 extends keyof GetGeneric<TForm>[TDependencies1],
26+
TDependencies3 extends keyof GetGeneric<TForm>[TDependencies1][TDependencies2],
27+
>(
28+
dependencies: [TDependencies1, TDependencies2, TDependencies3],
29+
form?: TForm,
30+
): GetGeneric<TForm>[TDependencies1][TDependencies2][TDependencies3];
31+
32+
function useWatch<
33+
TDependencies1 extends keyof GetGeneric<TForm>,
34+
TForm extends FormInstance,
35+
TDependencies2 extends keyof GetGeneric<TForm>[TDependencies1],
36+
>(
37+
dependencies: [TDependencies1, TDependencies2],
38+
form?: TForm,
39+
): GetGeneric<TForm>[TDependencies1][TDependencies2];
40+
41+
function useWatch<TDependencies extends keyof GetGeneric<TForm>, TForm extends FormInstance>(
42+
dependencies: TDependencies | [TDependencies],
43+
form?: TForm,
44+
): GetGeneric<TForm>[TDependencies];
45+
46+
function useWatch<TForm extends FormInstance>(dependencies: NamePath, form?: TForm): any;
47+
48+
function useWatch<ValueType = Store>(dependencies: NamePath, form?: FormInstance): ValueType;
49+
50+
function useWatch(dependencies: NamePath = [], form?: FormInstance) {
51+
const [value, setValue] = useState<any>();
52+
const valueCacheRef = useRef<any>();
1253
valueCacheRef.current = value;
1354

1455
const fieldContext = useContext(FieldContext);
@@ -57,6 +98,6 @@ const useWatch = <ValueType = Store>(dependencies: NamePath = [], form?: FormIns
5798
);
5899

59100
return value;
60-
};
101+
}
61102

62103
export default useWatch;

tests/useWatch.test.tsx

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,4 +275,33 @@ describe('useWatch', () => {
275275
});
276276
expect(renderTime).toEqual(2);
277277
});
278+
it('typescript', () => {
279+
type FieldType = {
280+
main?: string;
281+
name?: string;
282+
age?: number;
283+
gender?: boolean;
284+
demo?: string;
285+
demo2?: string;
286+
id?: number;
287+
demo1?: { demo2?: { demo3?: { demo4?: string } } };
288+
};
289+
290+
const Demo = () => {
291+
const [form] = Form.useForm<FieldType>();
292+
const main = Form.useWatch('main', form);
293+
const age = Form.useWatch(['age'], form);
294+
const demo1 = Form.useWatch(['demo1'], form);
295+
const demo2 = Form.useWatch(['demo1', 'demo2'], form);
296+
const demo3 = Form.useWatch(['demo1', 'demo2', 'demo3'], form);
297+
const demo4 = Form.useWatch(['demo1', 'demo2', 'demo3', 'demo4'], form);
298+
const demo5 = Form.useWatch(['demo1', 'demo2', 'demo3', 'demo4', 'demo5'], form);
299+
const more = Form.useWatch(['age', 'name', 'gender'], form);
300+
const demo = Form.useWatch<string>(['demo']);
301+
302+
return <>{JSON.stringify({ main, age, demo1, demo2, demo3, demo4, demo5, more, demo })}</>;
303+
};
304+
305+
mount(<Demo />);
306+
});
278307
});

0 commit comments

Comments
 (0)