useState<any>([])问题

来源:4-5 【副作用钩子】使用useEffect异步获取数据

deligent_wyt

2023-06-16

老师请问useState([])前面不加泛型any会报错显示“never上不存在xxx属性”,但是对string,number等其他的默认值不加泛型也不会报错,这点不是很明白

写回答

1回答

阿莱克斯刘

2025-01-22

这是一个很好的问题,涉及到 TypeScript 中类型推断的工作原理。让我详细解释一下。

### 1. TypeScript 类型推断
在 TypeScript 中,类型推断是一种机制,允许编译器自动确定变量的类型。对于 `useState` 钩子,TypeScript 会根据传递给 `useState` 的初始值来推断状态的类型。

### 2. 字符串和数字的推断
当你使用 `useState` 初始化为 `string` 或 `number` 时,TypeScript 可以轻松地推断出相应的类型,例如:

```
const [count, setCount] = useState(0); // 推断为 number
const [name, setName] = useState("John"); // 推断为 string
```

### 3. 空数组的特殊情况
当你使用 `useState([])` 时,TypeScript 推断初始状态为一个空数组,但由于数组的类型未明确指定,所以默认推断为 `never[]`。`never` 表示没有值的类型,因此会出现你提到的错误。

```
const [items, setItems] = useState([]); // 推断为 never[]
```

### 解决方法
为了避免这种问题,你可以显式地指定数组的类型。例如,如果你知道数组将包含字符串,可以这样做:

```
const [items, setItems] = useState<string[]>([]); // 推断为 string[]
```

或者,如果你不确定数组的具体类型,可以使用 `any`:

```
const [items, setItems] = useState<any[]>([]); // 推断为 any[]
```

### 示例对比
```
// 推断为 number
const [count, setCount] = useState(0);

// 推断为 string
const [name, setName] = useState("John");

// 推断为 never[], 会报错
const [items, setItems] = useState([]);

// 正确指定类型,推断为 string[]
const [items, setItems] = useState<string[]>([]);

// 使用 any,推断为 any[]
const [items, setItems] = useState<any[]>([]);
```

通过显式地为 `useState` 指定泛型类型,你可以避免由于类型不明确而导致的错误。

希望这些解释对你有所帮助!如果还有其他问题或需要进一步的解释,请随时告诉我。😊
0
0

React18 系统精讲 结合TS打造旅游电商平台

React18 精讲 + 结合 TS 实战 + 热门业务开发,获取必备技能

1993 学习 · 1015 问题

查看课程