我们必须尽快发现并消除问题。如果不使用 TypeScript 或 Flow,您宁愿使用验证库。它将帮助您避免花费数小时寻找由作为参数给出的无效类型引起的模糊错误。看起来很多人都认真对待 - https://www.npmjs.com/package/aproba 目前每周获得 9M(!) 次下载。
对我来说它不适合,在这里解释http://dsheiko.com/weblog/validating-arguments-in-javascript-like-a-boss
我选择基于 JSDoc 表达式的https://www.npmjs.com/package/bycontract:
import { validate } from "bycontract";
const PdfOptionsType = {
scale: "?number"
}
function pdf( path, w, h, options, callback ) {
validate( arguments, [
"string",
"!number",
"!number",
PdfOptionsType,
"function=" ] );
//...
return validate( returnValue, "Promise" );
}
pdf( "/tmp/test.pdf", 1, 1, { scale: 1 } ); // ok
pdf( "/tmp/test.pdf", "1", 1, { scale: 1 } ); // ByContractError: Argument #1: expected non-nullable but got string
在方法上,您可以重用现有的 JSDoc 注释块:
import { validateJsdoc, typedef } from "bycontract";
typedef("#PdfOptionsType", {
scale: "number"
});
class Page {
@validateJsdoc(`
@param {string} path
@param {!number} w
@param {!number} h
@param {#PdfOptionsType} options
@param {function=} callback
@returns {Promise}
`)
pdf( path, w, h, options, callback ) {
return Promise.resolve();
}
}
但是,我在开发/测试环境中保留此验证,但在现场跳过它:
import { config } from "bycontract";
if ( process.env.NODE_ENV === "production" ) {
config({ enable: false });
}