useState

  1. // 推断数字类型
  2. const [value, setValue] = useState(0);
  3. // 明确设定类型
  4. const [value, setValue] = useState<number | undefined>(undefined);
  5. const [value, setValue] = useState<Array<number>>([]);
  6. interface MyObject {
  7. foo: string;
  8. bar?: number;
  9. }
  10. const [value, setValue] = useState<MyObject>({ foo: 'hello' });

useContext

  1. type Theme = 'light' | 'dark';
  2. const ThemeContext = createContext<Theme>('dark');
  3. const App = () => (
  4. <ThemeContext.Provider value="dark">
  5. <MyComponent />
  6. </ThemeContext.Provider>
  7. )
  8. const MyComponent = () => {
  9. const theme = useContext(ThemeContext);
  10. return <div>The theme is {theme}</div>;
  11. }

useEffect / useLayoutEffect

因为它们不处理返回值,所以不需要任何类型。

  1. useEffect(() => {
  2. const subscriber = subscribe(options);
  3. return () => {
  4. unsubscribe(subscriber)
  5. };
  6. }, [options]);

useMemo / useCallback

  1. const value = 10;
  2. // 推断为数字类型
  3. const result = useMemo(() => value * 2, [value]);
  4. const multiplier = 2;
  5. // 推断为 (value: number) => number
  6. const multiply = useCallback((value: number) => value * multiplier, [multiplier]);

useRef

一般而言,useRef 有一个只读属性 current ,用来指向DOM节点:

  1. const MyInput = () => {
  2. const inputRef = useRef<HTMLInputElement>(null);
  3. return <input ref={inputRef} />
  4. }

useRef也可以用于类的示例属性:

  1. const myNumberRef = useRef(0);
  2. myNumberRef.current += 1;

useReducer

  1. interface State {
  2. value: number;
  3. }
  4. type Action =
  5. | { type: 'increment' }
  6. | { type: 'decrement' }
  7. | { type: 'incrementAmount'; amount: number };
  8. const counterReducer = (state: State, action: Action) => {
  9. switch (action.type) {
  10. case 'increment':
  11. return { value: state.value + 1 };
  12. case 'decrement':
  13. return { value: state.value - 1 };
  14. case 'incrementAmount':
  15. return { value: state.value + action.amount };
  16. default:
  17. throw new Error();
  18. }
  19. };
  20. const [state, dispatch] = useReducer(counterReducer, { value: 0 });
  21. dispatch({ type: 'increment' });
  22. dispatch({ type: 'decrement' });
  23. dispatch({ type: 'incrementAmount', amount: 10 });
  24. // TypeScript compilation error
  25. dispatch({ type: 'invalidActionType' });

useImperativeHandle

  1. export interface MyInputHandles {
  2. focus(): void;
  3. }
  4. const MyInput: RefForwardingComponent<MyInputHandles, MyInputProps> = (
  5. props,
  6. ref
  7. ) => {
  8. const inputRef = useRef<HTMLInputElement>(null);
  9. useImperativeHandle(ref, () => ({
  10. focus: () => {
  11. if (inputRef.current) {
  12. inputRef.current.focus();
  13. }
  14. },
  15. }));
  16. return <input {...props} ref={inputRef} />;
  17. };
  18. export default forwardRef(MyInput);
  1. import MyInput, { MyInputHandles } from './MyInput';
  2. const Autofocus = () => {
  3. const myInputRef = useRef<MyInputHandles>(null);
  4. useEffect(() => {
  5. if (myInputRef.current) {
  6. myInputRef.current.focus();
  7. }
  8. });
  9. return <MyInput ref={myInputRef} />
  10. }

useDebugValue

useDebugValue用于在React Developer Tools 中显示值,并接受一个值和一个可选的格式化函数,可以根据传入的值推断其类型。

  1. const date = new Date();
  2. useDebugValue(date, date => date.toISOString());