100 lines
2.7 KiB
Markdown
100 lines
2.7 KiB
Markdown
# UTS 数组类型推断问题修复总结
|
|
|
|
## 问题分析
|
|
|
|
在 `msgDataServiceReal.uts` 中遇到了两类 UTS 类型错误:
|
|
|
|
### 1. Array.isArray() 后的 length 访问问题
|
|
```
|
|
error: Unresolved reference: length
|
|
```
|
|
**原因**: UTS 无法正确推断 `Array.isArray()` 条件下的数组类型
|
|
|
|
### 2. 空数组类型推断问题
|
|
```
|
|
error: Not enough information to infer type variable E
|
|
```
|
|
**原因**: 空数组 `[]` 无法推断出明确的类型
|
|
|
|
## 修复方案
|
|
|
|
### 1. 使用类型断言处理 Array.isArray()
|
|
```typescript
|
|
// 修复前 - 类型推断失败
|
|
total_messages: Array.isArray(totalResponse.data) ? totalResponse.data.length : 0
|
|
|
|
// 修复后 - 明确类型断言
|
|
total_messages: Array.isArray(totalResponse.data) ? (totalResponse.data as Array<any>).length : 0
|
|
```
|
|
|
|
### 2. 明确空数组的类型
|
|
```typescript
|
|
// 修复前 - 类型推断失败
|
|
data: []
|
|
|
|
// 修复后 - 明确数组类型
|
|
data: [] as Array<UserOption>
|
|
data: [] as Array<MessageGroup>
|
|
```
|
|
|
|
## 具体修改
|
|
|
|
### 1. MessageStats 计算修复
|
|
```typescript
|
|
const stats : MessageStats = {
|
|
total_messages: Array.isArray(totalResponse.data) ? (totalResponse.data as Array<any>).length : 0,
|
|
unread_messages: Array.isArray(unreadResponse.data) ? (unreadResponse.data as Array<any>).length : 0,
|
|
urgent_messages: Array.isArray(urgentResponse.data) ? (urgentResponse.data as Array<any>).length : 0,
|
|
sent_messages: 0,
|
|
received_messages: 0,
|
|
draft_messages: 0
|
|
}
|
|
```
|
|
|
|
### 2. 错误处理中的空数组类型
|
|
```typescript
|
|
// 用户搜索错误处理
|
|
return {
|
|
status: 500,
|
|
data: [] as Array<UserOption>,
|
|
error: new UniError(...),
|
|
origin: null,
|
|
headers: {}
|
|
} as AkReqResponse<Array<UserOption>>
|
|
|
|
// 群组获取错误处理
|
|
return {
|
|
status: 500,
|
|
data: [] as Array<MessageGroup>,
|
|
error: new UniError(...),
|
|
origin: null,
|
|
headers: {}
|
|
} as AkReqResponse<Array<MessageGroup>>
|
|
```
|
|
|
|
## UTS 类型系统特点
|
|
|
|
### 1. 严格的类型推断
|
|
- UTS 要求明确的类型信息
|
|
- 无法像 TypeScript 那样智能推断复杂类型
|
|
- 需要显式的类型断言
|
|
|
|
### 2. Array.isArray() 的限制
|
|
- 条件判断后的类型守卫不够智能
|
|
- 需要手动进行类型断言
|
|
- 建议使用 `as Array<any>` 进行通用断言
|
|
|
|
### 3. 空数组处理
|
|
- 空数组必须明确指定类型
|
|
- 使用 `[] as Array<T>` 的形式
|
|
- 避免让 UTS 自动推断空数组类型
|
|
|
|
## 最佳实践
|
|
|
|
1. **主动类型断言**: 在类型不明确时主动使用 `as` 断言
|
|
2. **明确数组类型**: 空数组、条件数组都要明确类型
|
|
3. **保守的类型策略**: 使用 `Array<any>` 而非复杂的泛型推断
|
|
4. **一致的错误处理**: 统一错误返回对象的类型结构
|
|
|
|
这次修复解决了 UTS 在数组类型推断方面的限制,确保了消息系统的类型安全。
|