在 ArkTS 中,Promise 的使用比 TypeScript 更严格(必须显式指定泛型类型)。以下是完整用法:
1. 基本创建
typescript
// ✅ 显式指定泛型类型
const p1 = new Promise<string>((resolve, reject) => {
resolve('success'); // 类型必须是 string
});
const p2 = new Promise<void>((resolve) => {
setTimeout(() => resolve(), 1000); // 无返回值用 void
});
2. 链式调用
typescript
fetchData()
.then((data: string) => { // 类型必须标注
return data.toUpperCase();
})
.then((upper: string) => {
console.log(upper);
})
.catch((err: Error) => { // 错误类型建议标注
console.error(err);
})
.finally(() => { // finally 无参数
console.log('done');
});
3. 静态方法
typescript
// Promise.resolve - 必须带泛型
const resolved = Promise.resolve<string>('ok');
// Promise.reject - 必须带泛型
const rejected = Promise.reject<never>(new Error('fail'));
// Promise.all - 所有泛型都要显式写
const [a, b] = await Promise.all<string, number>([
Promise.resolve<string>('hello'),
Promise.resolve<number>(42)
]);
// Promise.allSettled
const results = await Promise.allSettled<string, number>([
Promise.resolve<string>('ok'),
Promise.reject<number>(new Error('fail'))
]);
// Promise.race
const winner = await Promise.race<string, number>([
fetchString(), // Promise<string>
fetchNumber() // Promise<number>
]);
// Promise.any
const firstSuccess = await Promise.any<string, number>([
Promise.reject<string>(new Error('fail1')),
Promise.resolve<number>(123)
]);
4. 与 async/await 配合
typescript
async function fetchUser(): Promise<User> { // 返回类型必须写
try {
const response = await httpRequest(); // await 正常用
return response as User;
} catch (error) {
// 错误处理
throw error;
}
}
5. 泛型嵌套(注意层层标注)
typescript
// Promise 里包 Promise
const nested = Promise.resolve<Promise<string>>(
Promise.resolve<string>('deep')
);
// 数组类型
const list = Promise.resolve<Array<string>>(
['a', 'b', 'c']
);
6. 鸿蒙特定 API 中使用
typescript
import { promptAction } from '@kit.ArkUI';
import { http } from '@kit.NetworkKit';
// 把回调式 API 包装为 Promise
function showDialog(): Promise<boolean> {
return new Promise<boolean>((resolve) => {
promptAction.showDialog({
message: '确定删除?',
buttons: [{ text: '确定' }, { text: '取消' }]
}, (err, result) => {
resolve(result.index === 0);
});
});
}
关键规则总结
| 规则 | 说明 |
|---|---|
| 泛型必须显式 | new Promise<T>()、Promise.resolve<T>(),T 不能省略 |
| 回调参数标注 | .then((val: Type) => ...) 建议标注类型 |
| async 返回类型 | async function(): Promise<T> 必须写 |
| 无返回值用 void | new Promise<void>() |
一句话记忆 :ArkTS 中只要看到 <>,里面的类型必须你自己写,编译器绝不帮你猜。