tslints "typedef" 和 typescript 编译器 "noImplicitAny" 有什么区别?

What is the difference between tslints "typedef" and typescript compilers "noImplicitAny"?

我正在使用 tslint 来检查我的 typescript 代码。我已经搜索了一段时间,但找不到使用 typescript 编译器选项 noImplicitAny 和 tslint 中的以下配置之间存在的差异(如果有的话):

"no-inferrable-types": [true]
"typedef": [
  true,
  "property-declaration",
  "variable-declaration",
  // ... etc ...
]

存在差异,而且差异很大。

NoImplicite any 在变量被识别为 any 且未直接键入时会抛出错误,例如:

let arr = []
arr.forEach(item => item) // Variable 'arr' implicitly has an 'any[]' type.(7005)

// but
[1,2,3].map(item => item) // OK

在第二种情况下,项目类型没有声明(就像第一个一样)但是 TS 编译器知道 item 变量是什么(Array<number> 上的映射必须用 number

还有这样的代码:

let arr = []
arr.forEach((item: any) => item) // OK

不会抛出错误。 item 是任意类型,但它是显式的,而不是隐式的。

在 linter 规则的情况下,它们只是强制您添加类型定义,因此此代码 [1,2,3].map(item => item) 将通过编译,但是 linter 将 makr 视为错误。