繁体   English   中英

TypeScript 和 typescript-eslint 有重叠的用途吗?

[英]Do TypeScript and typescript-eslint have overlapping purposes?

我正在阅读typescript-eslint文档,然后进入了这一部分:

TypeScript 和 ESLint 有相似的用途
这意味着在某些情况下,TypeScript 实际上为我们解决了以前依赖 ESLint 的问题。

考虑到它们的定义,一种是静态类型语言,一种是解析代码并放置一些断言以确保考虑某些规则和模式的工具,这是完全不同的东西。 我想知道可以给出哪些示例来solves a problem for us that we previously relied on ESLint for 这两件事有什么共同点吗? 它们的相似目的是什么?

由于 JavaScript 是一种动态类型语言,因此与使用编译器处理常见问题的静态语言相比,程序员可以更轻松地引入细微的错误和错误,这些错误和错误在运行时会失败。

以下面的代码为例:

console.log(someUndefinedVariable)

const constant = 0
constant = 3

const addOne = n => {
  if (typeof n !== 'nubmer') {
    throw new Error('n must be an number')
    console.log('This will never be executed')
  }
  if (n < 0) console.log('negative number')
  else return n + 1
}
console.log(addOne(-3) * 2)

const symbol = new Symbol()

此代码将在运行时失败,并且还有一些其他可能导致意外结果的问题。

诸如 ESLint 之类的 Linter 通过诸如 no-undef 和 no const-assign 之类的规则来解决其中的一些问题

 1:13  error  'someUndefinedVariable' is not defined      no-undef
 4:1   error  'constant' is constant                      no-const-assign
 7:20  error  Invalid typeof comparison value             valid-typeof
 9:3   error  Unreachable code                            no-unreachable
16:20  error  `Symbol` cannot be called as a constructor  no-new-symbol

同样,TypeScript 的编译器也会就以下许多问题向您发出警告

Cannot find name 'someUndefinedVariable'.

Cannot assign to 'constant' because it is a constant.

This condition will always return 'true' since the types
'"string" | "number" | "bigint" | "boolean" | "symbol" | "undefined" | "object" | "function"'
and '"nubmer"' have no overlap.

Unreachable code detected.

'new' expression, whose target lacks a construct signature, implicitly has an 'any' type.

从这个意义上说,ESLint 和 TypeScript 有相同的目标:通过事先警告你来防止可能的程序员错误。 对于这些问题,您可以关闭相应的 ESLint 规则并改用 TypeScript 编译器。


然而,TypeScript 最重要的特性是它向 JavaScript 添加了静态类型。 通过向addOne添加类型注释:

const addOne = (n: number): number => { /* ... */ }

TS 告诉我们, Function lacks ending return statement and return type does not include 'undefined'. 因为如果n是负数,函数将返回undefined而不是数字。 addOne(-3) * 2将是NaN ,而不是像预期的-4

另一个例子,ESLint 完全可以使用但在运行时失败:

const foo = 0
const bar = foo()
//          ~~~
// This expression is not callable.
//   Type 'Number' has no call signatures.

由于 TypeScript 的类型系统,这些是 TypeScript 可以帮助识别的许多问题中的一些。

另一方面,包括 ESLint 和 typescript-eslint 插件在内的 linter 可以强制执行最佳实践,例如使用严格相等运算符正确处理 promises 它们还可以强制执行样式约定,例如缩进要求或禁止分号一致的类型断言样式


TypeScript 和 ESLint 具有防止程序员错误和错误的相似目标。 然而,由于它的类型系统,TypeScript 可以发现更多的运行时和编程错误,而 ESLint 可以强制执行风格约定最佳实践

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM