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

时间:2016-07-13 14:48:30

标签: 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上抛出错误。错误是:

Property 'map' does not exist on type 'IObjectSchema | IObjectSchema[]'.

事情是 - 我处理IObjectSchema元素或这些元素的数组。当我进入Array.isArray...然后我100%确定我有一个数组,因此我在数组上有.map函数。这显然是JS。

但是,TypeScript似乎不相信它有.map可用,可能是,它无法识别Array.isArray...调用一级。

问题是 - 我如何使用变量,就好像它是一个类型化元素或一个类型化元素数组,如果它是一个数组,允许使用.map?我确定我的代码是JS正确的,但TS在这里抛出错误。

1 个答案:

答案 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时无法识别类型保护。
您只能使用typeofinstanceof

如果您仍想使用Array.isArray

,也可以创建自己的类型保护
function isObjectSchemaArray(items: IObjectSchema | IObjectSchema[]): items is IObjectSchema[] {
    return Array.isArray(items);
}

然后:

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