typescript - 如果参数类型为“从不”,则 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
解决方案
我不知道为什么这会any
在你的情况下给出,但你可以编写你自己的版本,ReturnType
它可以正常工作:
type MyReturnType<F extends Function> = F extends (...args: infer A) => infer R ? R : never;
推荐阅读
- symfony - Sf/Twig - 计算具有相同值的属性的数量
- python - 来自一列的 Y 轴来自不同列的 x 到不同的子图中
- java - 从不同版本的 java 项目文件创建新的本地 git 存储库
- html - 下划线css中的前5个元素
- node.js - 使用 next.js,为什么我突然开始看到 Module not found: Error: Can't resolve 'fs'?
- node.js - 在 Node.js 模型中使用 i18next
- javascript - 有没有一种方法可以在制表器 js 上按“月份”对数据进行分组,同时拥有完整的日期?
- html - 如何在另一个 div 上方添加隐藏的 div?
- javascript - 带有路由器的 Vue 模态
- java - 如何在 Java 中删除(有效)最终数组