首页 > 解决方案 > TypeScript 动态联合

问题描述

我正在尝试创建一个类型“助手”,它可以转换为一个联合,也许最好通过这个片段来表达:

type emailResponse = {
  email: string
}
NetworkActions<"EMAIL", emailResponse>
// translating to a union
{type: 'EMAIL_LOADING'} | {type: 'EMAIL_SUCCESS', payload: emailResponse} | {type: 'EMAIL_ERROR'}

第一个类型变量需要用作联合的三种类型的前缀。第二种类型的变量需要向下传递给联合的第二种类型。

这可以在 TypeScript 中实现吗?如何?

标签: typescript

解决方案


虽然目前还不可能,但在 typescript 4.1 发布后(2020 年 11 月)很快就会有可能。

type emailResponse = {
  email: string
}
type NetworkActions<P extends string, T> = 
  | { type: `${P}_LOADING` }
  | { type: `${P}_ERROR` }
  | { type: `${P}_SUCCESS`, payload: T }

type R = NetworkActions<"EMAIL", emailResponse>

游乐场链接

此PR中的更多详细信息


推荐阅读