【发布时间】: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
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
【问题讨论】:
-
我建议将其归档为issue;这是令人惊讶的行为,我找不到提及它的现有问题。似乎虽然
(a: never)=>0可分配给(...args:any)=>any,但它不能在条件类型中分配给(...args:any)=>infer R。在实践中,我认为带有never的参数列表不是很有用,所以它几乎没有什么大不了的,但它可能应该被跟踪。
标签: typescript