通常,如果未能在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中是否还有其他更直接的方法要求规范泛型类型参数?