我正在阅读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'.
则函数将返回undefined
而不是n
数字。的结果addOne(-3) * 2
将是NaN
,而不是-4
预期的结果。
另一个示例,ESLint完全可以使用,但在运行时失败:
const foo = 0
const bar = foo()
// ~~~
// This expression is not callable.
// Type 'Number' has no call signatures.
这些是TypeScript由于其类型系统而可以帮助识别的许多问题中的一些。
另一方面,包括ESLint和typescript-eslint插件在内的linter可以强制执行最佳实践,例如使用严格的相等运算符和正确处理promises。他们还可以强制执行诸如缩进,要求或禁止分号或一致的类型声明样式之类的样式约定。
TypeScript和ESLint具有防止程序员错误和错误的相似目标。但是,由于类型系统的原因,TypeScript可能会遇到更多的运行时错误和编程错误,而ESLint可以强制采用样式惯例和最佳实践。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句