簡體   English   中英

如果參數類型為“never”,typescript ReturnType 為“any”

[英]typescript ReturnType is “any” if parameter type is “never”

短篇故事

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

操場

我不知道為什么這會在您的情況下給出any ,但是您可以編寫自己的ReturnType版本,該版本可以正常工作:

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

游樂場鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM