在 ArkTS 中,Promise 的使用比 TypeScript 更严格(必须显式指定泛型类型)

在 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 中只要看到 <>,里面的类型必须你自己写,编译器绝不帮你猜。

相关推荐
子兮曰3 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰3 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万3 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝3 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋3 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁3 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
李少兄3 天前
JavaScript 隐式全局变量解析
javascript
汉堡大王95273 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大3 天前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师3 天前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端