【发布时间】:2020-01-05 20:34:23
【问题描述】:
我想创建一个函数check(f),其中参数f必须是返回与其参数相同类型的函数,类型会被推断出来。例如:
check((v: number) => v + 1); // OK
check((s: string) => s.toLowerCase()); // OK
check((v: number) => v.toString()); // Not OK
我尝试了以下方法:
function check<T>(f: (v: T) => T) { }
check((v: number) => v > 10 ? v : ""); // Shouldn't be OK
奇怪的是,这段代码确实在 TypeScript playground(运行 TypeScript 3.5.1)中报告了错误,但在我的 VS Code(运行 TypeScript 3.6.2)中却没有,它推断出通用参数T 为 <number | "">。发生这种情况是因为一些最新的变化吗?如果是这样,我怎样才能编写所需的check 函数?
更新
以下是重现问题的步骤:
- 创建一个空文件夹。
- 在文件夹内创建文件test.ts,内容为上面的示例代码。文件夹中没有其他文件,因此没有 tsconfig.json,因此所有设置都是默认设置。
- 用VS Code打开文件夹,打开test.ts。编辑器显示代码没有错误。将光标悬停在
check函数上方表明推断为check<number | "">。 - 打开控制台并运行
tsc test.ts。构建成功,没有错误。
【问题讨论】:
-
我想我没有得到你想要的。支票的返回类型应该是什么?
-
@JohnnyZabala
check返回void。不用担心check究竟做了什么,它主要用作类型保护。 -
好吧,您可以明确设置泛型类型:
check<number>((v: number) => v > 10 ? v : ""));,这应该会失败。但是,如果没有它,它也应该失败...... -
@HereticMonkey 这个想法是我希望
check自动推断f的类型。是的,我同意它应该在没有明确分配T的情况下失败,我不知道为什么它没有。 -
我实际上认为它在做正确的事情;它推断
T的最广泛类型,因为没有指导,它必须这样做。它不能仅仅因为您将它用于v而假设number。但我要让漫游这些虚拟大厅的一位 TS 专家回答:)。
标签: typescript typescript-generics