这是一个输入我的Redux存储的简化示例。
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,它可能会工作得更简单、更好。然而,这种类型在代码库中被广泛使用,这并不是我的全部,它将需要大量的重构,这是我想要避免的。
发布于 2019-02-25 20:18:24
虽然条件类型似乎等同于操作的data属性的类型,但typescript无法解决这一问题。如果条件类型包含无法解析的类型参数,则条件类型通常不会展开。虽然有很多情况下这样做是有意义的,但这些情况是非常专业的,通常不会在编译器中实现。
在这种情况下,将类型表示为类型查询会更容易。这更容易让编译器确定它是与x.data相同的类型。这是可行的
function getPayload<T extends SetNameAction>(x: T): SetNameAction['data']
{
return x.data;
}https://stackoverflow.com/questions/54865991
复制相似问题