Javascript typescript运行时数组类型.map方法可用

Javascript typescript运行时数组类型.map方法可用,javascript,arrays,types,typescript,Javascript,Arrays,Types,Typescript,我有以下代码: 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上引发了一个错误。错误是: P

我有以下代码:

  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
函数。这是显而易见的

然而,TypeScript似乎不相信它有可用的
.map
,可能它不识别
Array.isArray…
调用一级


问题是-如何将变量当作类型化元素或类型化元素数组使用,并允许使用.map作为数组?我确信我的代码是JS正确的,但是TS在这里抛出了错误。

编译器关于在类型
IObjectSchema | IObjectSchema[]
上没有
map
方法是正确的,因此您需要告诉它,在
if
之后,可以安全地假设您正在处理
IObjectSchema[]

您有两个选择:

(1) 铸造

(2) 使用

看起来您所做的与我的第二个解决方案类似,但是编译器在使用
Array.isArray

只能使用
typeof
instanceof

如果仍要使用
Array.isArray
,也可以创建自己的类型保护:

function isObjectSchemaArray(items: IObjectSchema | IObjectSchema[]): items is IObjectSchema[] {
    return Array.isArray(items);
}
然后:

if (isObjectSchemaArray(value.items)) { ... }

编译器没有在类型
IObjectSchema | IObjectSchema[]
上使用
map
方法是正确的,因此您需要告诉它,在
if
之后,可以安全地假设您正在处理
IObjectSchema[]

您有两个选择:

(1) 铸造

(2) 使用

看起来您所做的与我的第二个解决方案类似,但是编译器在使用
Array.isArray

只能使用
typeof
instanceof

如果仍要使用
Array.isArray
,也可以创建自己的类型保护:

function isObjectSchemaArray(items: IObjectSchema | IObjectSchema[]): items is IObjectSchema[] {
    return Array.isArray(items);
}
然后:

if (isObjectSchemaArray(value.items)) { ... }

我使用了第二种方法
if(数组的value.items实例){
但它仍然返回相同的错误,不知道为什么。对虚线属性使用类型保护是正确的。尝试使用我提供的
isObjectSchemaArray
方法我使用了第二种方法
if(数组的value.items实例){
它仍然返回相同的错误,不知道为什么。在虚线属性上使用类型保护是正确的。请尝试使用我提供的
isObjectSchemaArray
方法