开发

软件开发相关知识

TypeScript泛型组件与类型模式:2026年前端开发最佳实践

一、TypeScript与React 19

1.1 JSX Transform变化

React 17+引入了新的JSX Transform,不再需要导入React:

// 新写法(React 17+)
const Component = () =>Hello;

1.2 React.FC的问题

// 问题:children类型不明确
const BadComponent: React.FC = () =>Content;

// 推荐:使用函数声明
const GoodComponent = ({ name, children }: { name: string; children: React.ReactNode }) => {
  return{name}: {children};
};

二、泛型组件设计

2.1 基础泛型组件

interface ListProps{
  items: T[];
  renderItem: (item: T) => React.ReactNode;
  keyExtractor: (item: T) => string;
}

function List({ items, renderItem, keyExtractor }: ListProps) {
  return ({items.map((item) => ({renderItem(item)}))});
}

2.2 泛型Hooks

function useLocalStorage(key: string, initialValue: T) {
  const [storedValue, setStoredValue] = useState(() => {
    try {
      const item = window.localStorage.getItem(key);
      return item ? JSON.parse(item) : initialValue;
    } catch {
      return initialValue;
    }
  });

  const setValue = (value: T | ((val: T) => T)) => {
    try {
      const valueToStore = value instanceof Function ? value(storedValue) : value;
      setStoredValue(valueToStore);
      window.localStorage.setItem(key, JSON.stringify(valueToStore));
    } catch (error) {
      console.error(error);
    }
  };

  return [storedValue, setValue] as const;
}

三、可辨识联合类型

3.1 基础用法

type LoadingState = 
  | { status: 'idle' }
  | { status: 'loading' }
  | { status: 'success'; data: User[] }
  | { status: 'error'; error: string };

function UserList({ state }: { state: LoadingState }) {
  switch (state.status) {
    case 'success':
      return{state.data.map(user =>{user.name})};
    case 'error':
      return错误: {state.error};
  }
}