是否有一种方法可以让javascript函数知道某个参数是某个类型的?
能够做这样的事情将是完美的:
function myFunction(Date myDate, String myString)
{
//do stuff
}
谢谢你!
更新:作为答案是一个响亮的“不”,如果我想myDate被视为一个日期(为了在它上调用日期函数),我必须将其转换为函数内的日期或设置一个日期类型的新变量?
是否有一种方法可以让javascript函数知道某个参数是某个类型的?
能够做这样的事情将是完美的:
function myFunction(Date myDate, String myString)
{
//do stuff
}
谢谢你!
更新:作为答案是一个响亮的“不”,如果我想myDate被视为一个日期(为了在它上调用日期函数),我必须将其转换为函数内的日期或设置一个日期类型的新变量?
当前回答
我也一直在考虑这个问题。从C的背景,你可以模拟函数返回的代码类型,以及参数类型,使用如下:
function top_function() {
var rc;
console.log("1st call");
rc = Number(test_function("number", 1, "string", "my string"));
console.log("typeof rc: " + typeof rc + " rc: " + rc);
console.log("2nd call");
rc = Number(test_function("number", "a", "string", "my string"));
console.log("typeof rc: " + typeof rc + " rc: " + rc);
}
function test_function(parm_type_1, parm_val_1, parm_type_2, parm_val_2) {
if (typeof parm_val_1 !== parm_type_1) console.log("Parm 1 not correct type");
if (typeof parm_val_2 !== parm_type_2) console.log("Parm 2 not correct type");
return parm_val_1;
}
在调用函数之前的Number返回一个Number类型,而不管实际返回值的类型是什么,就像在第二次调用中看到的,其中typeof rc = Number但值是NaN
上面的console.log是:
1st call
typeof rc: number rc: 1
2nd call
Parm 1 not correct type
typeof rc: number rc: NaN
其他回答
不,JavaScript不是静态类型语言。有时可能需要手动检查函数体中的参数类型。
使用typeof或instanceof:
const assert = require('assert');
function myFunction(Date myDate, String myString)
{
assert( typeof(myString) === 'string', 'Error message about incorrect arg type');
assert( myDate instanceof Date, 'Error message about incorrect arg type');
}
也许是这样的辅助函数。但如果你发现自己经常使用这种语法,你可能应该切换到TypeScript。
function check(caller_args, ...types) {
if(!types.every((type, index) => {
if(typeof type === 'string')
return typeof caller_args[index] === type
return caller_args[index] instanceof type;
})) throw Error("Illegal argument given");
}
function abc(name, id, bla) {
check(arguments, "string", "number", MyClass)
// code
}
不,相反,你需要根据你的需要做这样的事情:
function myFunction(myDate, myString) {
if(arguments.length > 1 && typeof(Date.parse(myDate)) == "number" && typeof(myString) == "string") {
//Code here
}
}
虽然不能将类型通知JavaScript语言,但可以通知IDE,因此可以获得更有用的自动补全。
这里有两种方法:
Use JSDoc, a system for documenting JavaScript code in comments. In particular, you'll need the @param directive: /** * @param {Date} myDate - The date * @param {string} myString - The string */ function myFunction(myDate, myString) { // ... } You can also use JSDoc to define custom types and specify those in @param directives, but note that JSDoc won't do any type checking; it's only a documentation tool. To check types defined in JSDoc, look into TypeScript, which can parse JSDoc tags. Use type hinting by specifying the type right before the parameter in a /* comment */: This is a pretty widespread technique, used by ReactJS for instance. Very handy for parameters of callbacks passed to 3rd party libraries.
打印稿
对于实际的类型检查,最接近的解决方案是使用TypeScript,它是JavaScript的超集。这里是5分钟内的TypeScript。