首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Typescript:推断负载类型并将其传递给回调

Typescript:推断负载类型并将其传递给回调
EN

Stack Overflow用户
提问于 2019-02-25 20:14:01
回答 1查看 284关注 0票数 0

这是一个输入我的Redux存储的简化示例。

代码语言:javascript
运行
复制
interface SetNamePayload { name: string; }

export interface Action<TPayload extends object> {
    type: string;
    data: TPayload;
}

type SetNameAction = Action<SetNamePayload>;

// derive payload type from action type
type ResolveActionPayload<A extends Action<any>> =
    A extends Action<infer P> ? P : never;

// return type should be resolved to SetNamePayload
function getPayload<T extends SetNameAction>(x: T): ResolveActionPayload<T> 
{
    // TS2322: Type 'SetNamePayload' is not assignable to
    // type 'ResolveActionPayload<T>'.
    return x.data;
}

为什么返回类型不能解析为SetNamePayload,或者是否有可能以其他方式确定像这样声明的操作有效负载的类型?

似乎getPayload上的泛型是错误的,因为ResolveActionPayload按预期工作:

当然,在真实的代码中有更多的动作类型。该函数实际上看起来更像getPayload<T extends SomeAction | OtherAction | ...>。这确实是问题的一个主要方面。

此外,我知道我可以反转类型并使用有效负载类型作为泛型参数,比如getPayload<T>(x: Action<T>): T,它可能会工作得更简单、更好。然而,这种类型在代码库中被广泛使用,这并不是我的全部,它将需要大量的重构,这是我想要避免的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-25 20:18:24

虽然条件类型似乎等同于操作的data属性的类型,但typescript无法解决这一问题。如果条件类型包含无法解析的类型参数,则条件类型通常不会展开。虽然有很多情况下这样做是有意义的,但这些情况是非常专业的,通常不会在编译器中实现。

在这种情况下,将类型表示为类型查询会更容易。这更容易让编译器确定它是与x.data相同的类型。这是可行的

代码语言:javascript
运行
复制
function getPayload<T extends SetNameAction>(x: T): SetNameAction['data'] 
{
    return x.data;
}

Playground link

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54865991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档