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

相关推荐
GV191rLvq10 分钟前
基于Socket实现的最简单的Web服务器【ASP.NET原理分析】
服务器·前端·asp.net
吠品16 分钟前
LangChain 里 tool_call_id 为空?一次 MCP 工具集成的排查记录
前端
柒和远方36 分钟前
Phase 7.4 学习博客:为什么多 API 项目需要 Swagger / OpenAPI
前端·后端·架构
张龙68738 分钟前
拼多多开放平台对接踩坑实录:从 CLIENT_ID 配置到 MD5 签名算法的完整填坑指南
前端
GuWenyue1 小时前
提示词彻底过时?一套上下文工程方案,3步让LLM落地生产,代码直接复用
前端·javascript·人工智能
柒和远方1 小时前
Phase 7.3 复盘:后台任务不只是“扔进队列”,还要能被看见
前端·后端·架构
2501_943782351 小时前
【共创季稿事节】 倒计时器:时分秒选择器与定时器的协同工作
前端·华为·harmonyos·鸿蒙·鸿蒙系统
奶油mm1 小时前
公司技术债堆积如山,我一人之力用 Vue3 偷换了整个前端架构
前端·vue.js
用户938515635071 小时前
深入理解 JavaScript 中的 this 与数据存储的奥秘
前端·javascript
Tian_Hang1 小时前
eclipse ditto 学习笔记
运维·服务器·开发语言·javascript·3d