typescript - 根据参数进行类型推断

标签 typescript typescript2.8

在下面的情况下,是否可以将result的类型正确推断为boolean

interface ActionWithPayload<T extends string, K> { type: T, payload: K }

function ofType<T extends ActionWithPayload<string, any>>(...param: T["type"][]): T extends ActionWithPayload<typeof param[number], infer U> ? U : never {
    return null;
}

enum one {
    foo = "foo",
    bar = "bar"
}

type action = ActionWithPayload<one.foo, boolean> | ActionWithPayload<one.bar, string>;

var result = ofType<action>(one.foo); // type of result should be boolean

Playground link

最佳答案

问题是当 TactionT["type"] 将是 one.foo | one.bar 不管你传递什么参数。您需要一个额外的泛型参数,以便编译器推断您传入的枚举成员的文字类型:

function ofType<T extends ActionWithPayload<string, any>, K extends one = one>(...param:K[]): T extends ActionWithPayload<K, infer U> ? U : never {
    return null as any;
}
var result = ofType<action, one.foo>(one.foo); // will be boolean

缺点是您必须显式指定文字类型one.foo,因为您不能只指定一个类型参数。作为替代方案,您可以使用双函数方法,这样您就可以为第一个函数指定类型参数,并让推理为第二个函数工作:

function ofType<T extends ActionWithPayload<string, any>>() {
    return function <K extends one = one>(...param:K[]) : T extends ActionWithPayload<K, infer U> ? U : never{
         return null;
    }
}

var result = ofType<action>()(one.foo); // will be boolean

关于typescript - 根据参数进行类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49674994/

相关文章:

javascript - 如何在现有的申请中实现邀请注册?

javascript - 使用 Angular 从下拉列表中获取选定的值

javascript - Angular2 FileSaver.js

typescript,import * as,没有带括号属性访问器的索引签名

typescript - 仅接受数组值键(并推导返回类型)的函数

typescript - 如何从泛型函数中的参数类型推断返回类型?

typescript :在算术运算中使用 bool 类型