我有以下代码:
if (Array.isArray(value.items)) {
return Array.prototype.concat.apply(items, value.items.map(function(item, key) {
return traverseCallback(item, path.concat(['items', key]), resolve);
}));
}
在value.items.map
上抛出错误。错误是:
Property 'map' does not exist on type 'IObjectSchema | IObjectSchema[]'.
事情是 - 我处理IObjectSchema
元素或这些元素的数组。当我进入Array.isArray...
然后我100%确定我有一个数组,因此我在数组上有.map
函数。这显然是JS。
但是,TypeScript似乎不相信它有.map
可用,可能是,它无法识别Array.isArray...
调用一级。
问题是 - 我如何使用变量,就好像它是一个类型化元素或一个类型化元素数组,如果它是一个数组,允许使用.map?我确定我的代码是JS正确的,但TS在这里抛出错误。
答案 0 :(得分:0)
编译器在类型map
上没有IObjectSchema | IObjectSchema[]
方法是正确的,因此您需要告诉它if
之后可以安全地假设您正在处理IObjectSchema[]
{1}}。
您有两种选择:
(1)演员
if (Array.isArray(value.items)) {
return Array.prototype.concat.apply(items, (value.items as IObjectSchema[]).map(function(item, key) {
return traverseCallback(item, path.concat(['items', key]), resolve);
}));
}
(2)使用type guards
if (value.items instanceof Array) {
return Array.prototype.concat.apply(items, value.items.map(function(item, key) {
return traverseCallback(item, path.concat(['items', key]), resolve);
}));
}
看起来你所做的与我的第二个解决方案类似,但编译器在使用Array.isArray
时无法识别类型保护。
您只能使用typeof
或instanceof
。
如果您仍想使用Array.isArray
:
function isObjectSchemaArray(items: IObjectSchema | IObjectSchema[]): items is IObjectSchema[] {
return Array.isArray(items);
}
然后:
if (isObjectSchemaArray(value.items)) { ... }