Typescript: 类型检查器无法输入

创建于 2016-11-08  ·  3评论  ·  资料来源: microsoft/TypeScript

TypeScript版本: 2.0.8

代码

// test.ts
interface Type {
  type: number;
}

interface TypeExt extends Type {
  arr: Type[];
}

const guard = (arg: Type): arg is TypeExt => arg.type === 1;
const otherFunc = (arg1: Type, arg2: TypeExt): void => {};

export function y(arg: Type): void {
  if (guard(arg)) {
    for (const ITEM/* error is here */ of arg.arr) {
      if (otherFunc(ITEM, arg)) {
      }
    }
  }
}

使用cmd编译: tsc --noImplicitAny test.ts

预期行为:
没有错误

实际行为:

test.ts(14,16): error TS7022: 'ITEM' implicitly has type 'any' because it does not have a type annotation and is referenced directly or indirectly in its own initializer.
Bug Fixed

最有用的评论

这是一个控制流分析问题。 为了推断ITEM的类型,我们需要找出arg.arr的控制流类型。 反过来,这意味着我们需要研究影响arg类型的构造。 这包括对otherFunc的调用,该调用看起来像是用户定义的类型谓词。 为了确定它是否为类型谓词,我们解析了调用表达式,这需要解析参数表达式,这要求我们知道ITEM 。 这会创建我们无法解析的圆度,因此我们回退到隐式的any类型。

我们可以通过让类型谓词识别逻辑首先解析功能对象的类型并检查所有调用签名来解决此问题。 如果它们都不是用户定义的类型谓词,我们可以在不解决调用参数表达式的情况下提早纾困,这避免了循环性。

同时,只需在调用otherFunc arg中添加括号即可打破圆度。 换句话说,将呼叫更改为otherFunc(ITEM, (arg)) 。 这导致控制流分析器不再将调用视为可能的用户定义类型谓词调用。

所有3条评论

这是一个控制流分析问题。 为了推断ITEM的类型,我们需要找出arg.arr的控制流类型。 反过来,这意味着我们需要研究影响arg类型的构造。 这包括对otherFunc的调用,该调用看起来像是用户定义的类型谓词。 为了确定它是否为类型谓词,我们解析了调用表达式,这需要解析参数表达式,这要求我们知道ITEM 。 这会创建我们无法解析的圆度,因此我们回退到隐式的any类型。

我们可以通过让类型谓词识别逻辑首先解析功能对象的类型并检查所有调用签名来解决此问题。 如果它们都不是用户定义的类型谓词,我们可以在不解决调用参数表达式的情况下提早纾困,这避免了循环性。

同时,只需在调用otherFunc arg中添加括号即可打破圆度。 换句话说,将呼叫更改为otherFunc(ITEM, (arg)) 。 这导致控制流分析器不再将调用视为可能的用户定义类型谓词调用。

@ahejlsberg
感谢您使用括号解决方法。
我想弄清楚这一点。 公关是可以接受的,不是吗?

@arusakov现在修复大师!

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

kimamula picture kimamula  ·  147评论

RyanCavanaugh picture RyanCavanaugh  ·  205评论

disshishkov picture disshishkov  ·  224评论

born2net picture born2net  ·  150评论

rbuckton picture rbuckton  ·  139评论