我正在努力减少代码库中意外未知的泛型类型参数的使用。我正在使用像下面这样的Closure TTL咒语,将未知的泛型类型强制转换为undefined
类型,希望会引发导致我发现这些情况的错误(请参见this related question)。
* @template T
* @template TYPE_I_ACTUALLY_USE := cond(isUnknown(T), 'undefined', T) =:
这使我想到了这样的情况:
/**
* @template T
* @template R := cond(isUnknown(T), 'undefined', T) =:
* @param {function():R} factory
* @return {{prop: R}}
*/
function factoryWrapper(factory) {
return {prop: factory()};
}
var instance = factoryWrapper(() => 2);
此factoryWrapper
函数采用一个factory
函数,该函数产生类型为R
的值,对其进行调用,并将结果包装在{prop: ...}
中,以返回类型{ {1}}。但是因为我在调用{prop: R}
时没有指定T
或R
,所以它不知道它们应该是什么类型,也无法确定所提供的工厂函数返回正确的类型,因此会产生错误或无类型的输出:
factoryWrapper
在具有本机类型注释语法的语言(如TypeScript)中,我可以通过在调用中包含通用类型参数来解决此问题:
input0:11: WARNING - inconsistent return type
found : number
required: undefined
var instance = factoryWrapper(() => 2);
但是,我无法找出Closure的任何等效语法。我做出了一些猜测,如下所示,但没有一个奏效。
var instance = factoryWrapper<number>(() => 2);
如何为Closure JavaScript中的函数调用指定通用类型参数?
答案 0 :(得分:3)
Closure Compiler不允许您在调用泛型函数时指定类型参数。但是我认为强制执行回调将实现您想要的功能。就像是:
var instance = factoryWrapper(/** @type {function(): number} */ (() => 2));