如何在Closure中为函数调用指定通用类型参数?

时间:2018-06-19 18:40:57

标签: javascript google-closure-compiler

我正在努力减少代码库中意外未知的泛型类型参数的使用。我正在使用像下面这样的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}时没有指定TR,所以它不知道它们应该是什么类型,也无法确定所提供的工厂函数返回正确的类型,因此会产生错误或无类型的输出:

factoryWrapper

在具有本机类型注释语法的语言(如TypeScript)中,我可以通过在调用中包含通用类型参数来解决此问题:

input0:11: WARNING - inconsistent return type
found   : number
required: undefined
var instance = factoryWrapper(() => 2);

但是,我无法找出Closure的任何等效语法。我做出了一些猜测,如下所示,但没有一个奏效。

var instance = factoryWrapper<number>(() => 2);

如何为Closure JavaScript中的函数调用指定通用类型参数?

1 个答案:

答案 0 :(得分:3)

Closure Compiler不允许您在调用泛型函数时指定类型参数。但是我认为强制执行回调将实现您想要的功能。就像是: var instance = factoryWrapper(/** @type {function(): number} */ (() => 2));