我编写了以下打字代码,希望获得函数fn的推断返回值:

declare const fn: <T>(arg: T) => T extends string ? number : boolean;

type a1 = typeof fn("abc");

但typeof不能直接应用于函数调用.

我发现了一个类似的问题,但我看了相关答案,没有回答我的疑问.请让我解释一下我打算清除它.

我了解返回值可以通过以下方式获得

type a2 = ReturnType<typeof fn>

但这会丢失类型推断,并且我希望能够通过直接调用函数来推断真正的类型,因此我可以通过以下方式完成此操作:

const ret = fn("abc");

type a3 = typeof ret;

这种方法满足了我的核心需求,但‘ret’似乎是多余的,我理想的写作方式是我发布的第一个代码片段,但TypeScrip似乎不支持它,这让我觉得奇怪.Typeof可用于提取值的类型.将方法调用放在其右侧以检索函数返回值的类型应该是有意义的.

有些朋友不理解为什么我拒绝将泛型参数直接传递给泛型函数.我试着表达我的 idea :当我编写文字脚本时,我希望用户使用所有的泛型函数作为普通函数,而不传递泛型参数.函数将根据用户传入的实际参数推断所有类型,而我放置的泛型参数仅用于推断相关类型,而不是让用户传入.因为我认为显式传递泛型参数的用户看起来非常不智能,泛型旨在帮助类型推断,而不是用户应该直接传递的东西.

我重新组织了我的问题,我想我最大的问题是为什么type a1 = typeof fn("ABC");不起作用,它看起来非常直观,我希望有其他简洁的方式来写,但看起来没有.‘"

推荐答案

简短的回答是"为什么typeof fn("abc")不受支持?"没有人实施对它的支持.支持这些功能需要付出很大努力,默认情况下,the typeof type operator不适用于任意类型的脚本表达式.

有人提议在microsoft/TypeScript#6606中支持typeof fn("abc"),以及typeof expr支持任何打字表达式expr,但最终是closed as "Too Complex",其基本原理是conditional types(例如the ReturnType<T> utility type)将用于所谓的"呼叫类型"的大多数目的.当然,ReturnType<T>只适用于非generic、非overloaded的函数.

请注意,instantiation expressions至少可以表达在实例化泛型函数的类型参数时会发生什么(S).所以如果你有一个函数declare function func<T, U, V>(⋯): ⋯,那么你可以写typeof func<X, Y, Z>来获得你调用func<X, Y, Z>(⋯);时得到的函数的类型,所以如果你调用fn("abc"),那么类型参数T就会用literal type "abc"实例化,所以返回类型可以表示为ReturnType<typeof fn<"abc">>.但这并不能直接让您插入函数的值参数,并让编译器将类型参数转换为infer.因此,它不符合问题中所述的要求.

当前有针对呼叫类型的开放功能请求,号码为microsoft/TypeScript#40179.如果实现了这一点,您将有能力编写typeof fn("abc")或类似的内容.它目前被标记为"等待更多反馈",这意味着他们需要看到更多的支持(?对问题的开头 comments )和更多的 comments ,描述为什么实施它将是重要的,以及当前的解决办法是如何不足的.如果你真的想看到这一点得到实施,那么go 那里给它这样的赞成票和 comments 并不会有什么坏处.它可能也不会有help多,但它不会有什么坏处.

Typescript相关问答推荐

根据另一个成员推断类成员的类型

如果在TypeScript中一个原始的类方法是递归的,如何使用类decorator 模式?

将props传递给子组件并有条件地呈现它''

根据另一个属性的值来推断属性的类型

具有泛型类方法的类方法修饰符

在函数中打字推断记录的关键字

如何在Vue中使用Enum作为传递属性的键类型?

如何获取受类型脚本泛型约束的有效输入参数

ANGLE订阅要么不更新价值,要么不识别价值变化

在打字脚本中对可迭代对象进行可变压缩

类型与泛型抽象类中的类型不可比较

创建一个TypeScrip对象并基于来自输入对象的约束定义其类型

在Thunk中间件中输入额外参数时Redux工具包的打字脚本错误

如何处理可能为空的变量...我知道这不是Null?

在对象数组中设置值

Select 器数组到映射器的Typescript 泛型

在Nestjs中,向模块提供抽象类无法正常工作

错误:仅允许在‘使用服务器’文件中导出异步函数

如何编写一个接受 (string|number|null|undefined) 但只返回 string 且可能返回 null|undefined 的函数?

具有来自其他类型的修改键名称的 TypeScript 通用类型