一个简单的问题,我遇到了一些问题
我有一个简单的方法
function doSomethin()
{
const getSomeVariableFromAFunction = getSomeFromFunction.filter(foo => foo.id ===
bar.id).map(foo =>foo.virtenv).sort();
}
如何类型检查 foo 的类型为 Foo?
我试过了
const getSomeVariableFromAFunction = getSomeFromFunction.filter({foo:Foo} => foo.id ===
bar.id).map(foo =>foo.virtenv).sort();
但这似乎不起作用。
在 JavaScript 中,构造函数扮演着类型的角色,因此大多数情况下,您可以检查构造函数。
比方说,您需要使用数组或对象,并忽略其他输入。你可以这样检查:
const sortOut = unknownArgument => {
if (unknownArgument == null) return;
if (unknownArgument.constructor == Array) {
for (let element of unknownArgument)
console.log(element);
} else if (unknownArgument.constructor == Object)
for (let key in unknownArgument)
console.log(key);
};
// test it:
sortOut([1, 2, 32, "some data"]); // first branch => 1, 2, 32, "some data"
sortOut({ a: 1, b: 2, c: 32, d: "some data" }); // second branch => a, b, c, d
现在,您可以使用自己的构造函数创建您自己类型的对象。你可以用同样的方式检查它的类型:
function MyData() {
this.a = 1;
this.b = 2;
this.c = 32;
this.d = "some data";
}
// ...
const dealOnlyWithMyType = unknownArgument => {
if (unknownArgument == null) return;
if (unknownArgument.constructor != MyData) return;
for (let key in unknownArgument)
console.log(key);
}; //dealOnlyWithMyType
// test it:
dealOnlyWithMyType(new MyData()); // => a, b, c, d
那
typeof
呢?它不如使用constructor
,因为它返回一个字符串,如果你用它来检查,你总是可能拼错字符串内容,并且不会得到任何错误。
然而,
typeof
有一个独特且有价值的好处:它可以处理不存在的对象,不仅是undefined
,还可以处理那些没有真正定义的对象。这些是不同的事情。你可以定义一个对象,但是给它赋值 undefined
,但是这个对象实际上已经被定义了。考虑一下:
const unknownType = typeof aaaa; // let's assume aaa wasn't even declared anywhere
if (unknownType == typeof undefined)
console.log("What the hell is aaaa?!");
您可以在映射中使用此类检查作为 typecheck。