我正在学习 TypeScript 泛型。我创建了一个如下所示的泛型函数:
function getRandomElement<T>(items: T[]): T {
let ranIndex = Math.floor(Math.random() * items.length);
return items[ranIndex];
}
然后我有意调用该函数并仅传递类型(不将参数传递到函数中)。
let result = getRandomElement<number>;
然后我以为 Ts 编译器会给出关于创建result变量语句的错误消息,但什么也没发生。结果之后变成了一个函数((items: number[]) => number
)。我想更多地研究一下 typescript 的这个特性。但搜索了一段时间后,我没有找到任何必要的信息。
您能帮忙解释一下这个功能或者给我一个关于它的关键词吗?谢谢你考虑我这个愚蠢的问题。
具有讽刺意味的是,下面这一行所做的操作在许多编程语言中都很正常:
您只是将一个函数分配给变量,这在 JavaScript/Typescript 中完全有效。这就是为什么 TypeScript 不会抱怨 -您没有做错任何事 - 至少目前还没有;-)
请注意,您不是在调用该函数...只是将其分配给另一个变量。这也意味着您可以直接调用分配的函数(如果您愿意),如下所示:
如果您希望看到某些事情发生,那么这行代码(函数调用)是必需的。换句话说,您可能需要调用一个函数来查看任何合理的输出/结果。
getRandomElement<number>
是一个实例化表达式,如在microsoft/TypeScript#47607中实现并在 TypeScript 4.7 中引入的。我们在调用泛型函数时总是能够手动指定它的类型参数,例如
f<X, Y>(a, b, c)
:但是实例化表达式允许您在不调用它的情况下做到这一点,例如
f<X, Y>
。也就是说,您现在可以编写(f<X, Y>)(a, b, c)
,其中f<X, Y>
是它自己的表达式:生成的函数
(f<X, Y>)
不是通用的,并且可以保存到它自己的变量中:然后可以使用相同类型的参数重复调用此函数:
游乐场链接到代码