You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为React函数组件的state指定TypeScript接口类型?

给React State添加TypeScript接口的方法

你可以通过useState的泛型参数直接指定状态的类型为Drink[],同时优化初始值和数据获取的类型处理,具体操作如下:

1. 调整接口位置(可选但推荐)

把Drink接口移到组件外部,方便复用且更符合代码组织规范:

interface Drink {
  strCategory: string;
}

function App() {
  // ... 组件内容
}

2. 给useState指定类型

在useState后通过<>传入泛型类型Drink[],初始值可以用符合类型的空数组(或保留你原有的初始对象数组):

// 方式1:空数组作为初始值(更合理)
const [drinks, setDrinks] = useState<Drink[]>([]);

// 方式2:保留原有初始对象
const [drinks, setDrinks] = useState<Drink[]>([{strCategory: ''}]);

3. 优化数据获取的类型安全

为避免jsonData类型模糊,可给它指定包含drinks字段的接口,或直接用类型断言:

const fetchData = async () => {
  const response = await fetch('https://www.thecocktaildb.com/api/json/v1/1/list.php?c=list');
  // 定义API返回数据的类型
  interface ApiResponse {
    drinks: Drink[];
  }
  const jsonData = await response.json() as ApiResponse;
  setDrinks(jsonData.drinks);
};

完整修改后的代码

interface Drink {
  strCategory: string;
}

function App() {
  const [drinks, setDrinks] = useState<Drink[]>([]);

  const fetchData = async () => {
    const response = await fetch('https://www.thecocktaildb.com/api/json/v1/1/list.php?c=list');
    interface ApiResponse {
      drinks: Drink[];
    }
    const jsonData = await response.json() as ApiResponse;
    setDrinks(jsonData.drinks);
  };

  useEffect(() => {
    fetchData();
  }, []);

  return (
    <div className="App">
      <header className="App-header">
        <h2>Drinks</h2>
        {drinks.map((item, index) => {
          return <Link className='App-link' key={index} to={`/category?c=${item.strCategory}`}>{item.strCategory}</Link>;
        })}
      </header>
    </div>
  );
}

注:我还修改了to属性的写法,用模板字符串把strCategory拼接到URL中,确保跳转链接携带正确的分类参数。

内容的提问来源于stack exchange,提问作者NewToJS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 04:20:23