Ama*_*mas 6 javascript typescript
我正在阅读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()
Run Code Online (Sandbox Code Playgroud)
此代码将在运行时失败,并且还有一些其他可能导致意外结果的问题。
诸如 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
Run Code Online (Sandbox Code Playgroud)
同样,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.
Run Code Online (Sandbox Code Playgroud)
从这个意义上说,ESLint 和 TypeScript 有相同的目标:通过事先警告你来防止可能的程序员错误。对于这些问题,您可以关闭相应的 ESLint 规则并改用 TypeScript 编译器。
然而,TypeScript 最重要的特性是它向 JavaScript 添加了静态类型。通过将类型注释添加到addOne:
const addOne = (n: number): number => { /* ... */ }
Run Code Online (Sandbox Code Playgroud)
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.
Run Code Online (Sandbox Code Playgroud)
由于 TypeScript 的类型系统,这些是 TypeScript 可以帮助识别的许多问题中的一些。
另一方面,包括 ESLint 和 typescript-eslint 插件在内的 linter 可以强制执行最佳实践,例如使用严格相等运算符和正确处理 promises。它们还可以强制执行样式约定,例如缩进、要求或禁止分号或一致的类型断言样式。
TypeScript 和 ESLint 具有防止程序员错误和错误的相似目标。然而,由于它的类型系统,TypeScript 可以发现更多的运行时和编程错误,而 ESLint 可以强制执行风格约定和最佳实践。
| 归档时间: |
|
| 查看次数: |
262 次 |
| 最近记录: |