You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在TypeScript中获取Promise的resolved类型?

如何从Promise类型中提取解析后的值类型?

当然可行!TypeScript提供了直接的方式帮你从Promise<T>里提取出T类型,下面分两种情况给你说明:

方法一:使用内置的Awaited工具类型(TS 4.5+)

TypeScript 4.5及以上版本引入了Awaited工具类型,专门用来提取Promise解析后的值类型,用法非常直接:

// 先获取getUser函数返回的Promise<User>类型,再用Awaited提取User
type UserType = Awaited<ReturnType<typeof API.getUser>>;

// 适配你的createAction代码:
const fetchUserSuccess = createAction(
  'users/GET_ONE_SUCCESS',
  (user: Awaited<ReturnType<typeof API.getUser>>) => user,
);

Awaited还能处理嵌套的Promise(比如Promise<Promise<User>>),会自动递归提取最内层的类型,非常实用。

方法二:自定义工具类型(兼容TS 4.5以下版本)

如果你还在使用低于4.5的TypeScript版本,可以自己用条件类型+infer关键字实现一个工具类型:

// 定义一个工具类型,提取Promise包裹的类型
type UnwrapPromise<T> = T extends Promise<infer U> ? U : T;

// 用法和上面类似:
type UserType = UnwrapPromise<ReturnType<typeof API.getUser>>;

// 应用到你的代码里:
const fetchUserSuccess = createAction(
  'users/GET_ONE_SUCCESS',
  (user: UnwrapPromise<ReturnType<typeof API.getUser>>) => user,
);

这里的infer U是让TypeScript自动推断出Promise内部包裹的类型,然后返回这个类型U;如果传入的不是Promise类型,就直接返回原类型。

两种方法都能帮你准确拿到User类型,不用再手动写User啦!

内容的提问来源于stack exchange,提问作者corvid

火山引擎 最新活动