强制规范通用闭包类型

时间:2018-06-19 19:02:32

标签: javascript google-closure-compiler

通常,如果未能在Closure中指定泛型类型参数,则不会引发错误。这与许多其他语言(包括TypeScript)不同。闭包会将类型视为“未知”类型,通常将其忽略。 (可以设置编译器标志来抱怨未知类型,但是只能在全局范围内设置它们,并且通常太吵而不能真正使用。)

我有一个闭包课程Response<T>。我希望所有Response实例都为<T>指定一种类型,而不是简单地不输入任何类型。为此,无论何时尝试实例化通用实例,我都想强制执行编译时错误,以便我可以查找并修复所有此类实例。

我一直试图从the Closure Type Transformation Language中强制这种行为,但是我尝试执行的操作实际上并没有产生错误。这是我的最新尝试,但似乎被忽略了:

/**
 * @template OPT_RESPONSE_TYPE
 * @template RESPONSE_TYPE := cond(
 *     !isUnknown(OPT_RESPONSE_TYPE),
 *     OPT_RESPONSE_TYPE,
 *     printType(
 *         'ERROR: Please specify a non-generic type for Response',
 *         typeExpr('ERROR')
 *     )
 * ) =:
 *
 * @param {RESPONSE_TYPE=} value
 */
const Response = class {
  constructor(value = undefined) {
    /** @const */
    this.value = value;
  }
}

作为对策,我一直在将所有未知/未指定的泛型类型转换为undefined类型,因为这将鼓励编译器为潜在的不安全使用引发更多错误:

 * @template OPT_RESPONSE_TYPE
 * @template RESPONSE_TYPE := cond(isUnknown(OPT_RESPONSE_TYPE), 'undefined', OPT_RESPONSE_TYPE) =:

在Closure中是否还有其他更直接的方法要求规范泛型类型参数?

1 个答案:

答案 0 :(得分:1)

这可能是您可以使用custom conformance config做的事情。如果您有足够的勇气去研究未记录的类型转换语言,那也不是问题。