[英]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.