【问题标题】:typescript ReturnType is "any" if parameter type is "never"如果参数类型为“从不”,则 typescript ReturnType 为“any”
【发布时间】:2020-09-05 11:47:12
【问题描述】:

短篇小说

const abc = (a:never):number=>1
    
type a = ReturnType< typeof abc> //any

const abc2 = (a:number, b:never):number=>1

type a2 = ReturnType< typeof abc2> //any

playground

ReturnType 是 any 如果任何类型的参数是 never,有没有办法克服这个问题?

长篇大论(如果您对用例感到好奇)

我有一个实用程序类型可以防止未定义的部分对象成员、空对象或多余的对象成员完美地工作

type _NoExcessEmptyUndefined<M, T> = M extends T
    ? keyof M extends keyof T
        ? keyof M extends never
            ? never
            : undefined extends M[keyof M]
            ? never
            : M
        : never
    : never

type something = {a?:number,b:boolean,c:string}

const abc = <M extends something>(data:_NoExcessEmptyUndefined<M,something>):number=>1

const emptyObject = {}
const undefinedPartial = {a:undefined,b:true,c:"1"}
const excessMember = {b:true,c:"1",d:1}

abc(emptyObject) // error if empty object
abc(undefinedPartial) // error if partial member is undefined
abc(excessMember) // error if excessMember

const success1 = {b:true,c:"1"}
const success2 = {a:1, b:true,c:"1"}

abc(success1) // no error
abc(success2) // no error

type haha = ReturnType<typeof abc> // haha is any <-- problem
type hihi = Parameters<typeof abc>[0] // hihi is never

playground

【问题讨论】:

  • 我建议将其归档为issue;这是令人惊讶的行为,我找不到提及它的现有问题。似乎虽然(a: never)=&gt;0 可分配给(...args:any)=&gt;any,但它不能在条件类型中分配给(...args:any)=&gt;infer R。在实践中,我认为带有never 的参数列表不是很有用,所以它几乎没有什么大不了的,但它可能应该被跟踪。

标签: typescript


【解决方案1】:

我不知道为什么在你的情况下这会给出any,但你可以编写自己的ReturnType 版本,它可以正常工作:

type MyReturnType<F extends Function> = F extends (...args: infer A) => infer R ? R : never;

Playground Link

【讨论】:

    猜你喜欢
    • 2019-02-10
    • 2023-03-13
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 2018-10-23
    • 2021-12-03
    • 2021-12-11
    相关资源
    最近更新 更多