首页 > 解决方案 > 如果参数类型为“从不”,则 typescript ReturnType 为“any”

问题描述

短篇故事

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

操场

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

长话短说(如果您对用例感到好奇)

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

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

操场

标签: typescript

解决方案


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

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

游乐场链接


推荐阅读