javascript - Google Closure 不会因错误类型而失败
问题描述
我正在尝试为接收对象数组的函数编写注释。我希望对象具有某些强制性属性。
当我设置内部对象的类型并检查它时,它工作得很好。但是一旦我添加了数组,编译器就会“跳过”测试对象类型检查。
这是一个示例代码(运行它)
(链接似乎有问题,请复制并粘贴下面的代码)
// ==ClosureCompiler==
// @compilation_level ADVANCED_OPTIMIZATIONS
// @output_file_name default.js
// @formatting pretty_print
// ==/ClosureCompiler==
/**
* @record
* @struct
*/
const myType = function() {};
/** @type {!string} */
myType.prototype.arg1;
/**
* @param {myType} input
*/
function run_single(input) {
console.log(input);
}
/**
* @param {!Array<myType>} input_arr
*/
function run_array(input_arr) {
console.log(input_arr);
};
var t = {"arg1": 1};
run_array([t]);
run_single(t);
我预计run_array
会失败。但事实并非如此。但是,run_single
工作正常。
JSC_TYPE_MISMATCH: actual parameter 1 of run_single does not match formal parameter
found : {arg1: number}
required: (myType|null) at line 26 character 11
run_single(t);
解决方案
不幸的是,闭包总是将数组文字推断为 Array of ?。作为 ?将始终匹配,这会导致您看到的行为。
你可能会考虑使用 TypeScript 在这里做得更好
推荐阅读
- python - kivy 中超过了最大递归深度,但仅在打包时才超出,而不是在使用 python 开发应用程序时
- json - 在 LinkExtractor 中抓取多个正则表达式似乎不起作用
- c# - C# : Common method/wrapper for methods with different definitions
- r - 移除 ggplot facet strip 标签周围的三边边框
- php - 联系表格 7 wpcf7_before_send_mail 挂钩
- .htaccess - .htaccess 文件未将 HTTP 重定向到 HTTPS
- javascript - P5 组件在移动浏览器中停止更新(但在 PC 浏览器中有效)
- reporting-services - 如何为 SparkLine 数据添加边框?
- hyperledger-fabric - Fabric 网络的单一组织背书策略
- mapbox-gl-js - 手动触发 Mapbox-GL-Draw 绘图模式