2020年我们真的需要TypeScript吗?

再次制作JavaScript Java

TypeScript已成为现代Web开发人员的基本技能之一。 在2019年,他在GitHub上进入了十大最常用的语言 ,他的支持已完全添加到Create react应用程序中,您还可以找到很多其他证据表明它越来越受欢迎。 同时,诸如Java和C之类的语言继续失落

当我们谈论TypeScript的好处时,通常会想到以下列表:

  • TypeScript支持静态输入
  • TypeScript使代码更易于阅读和理解。
  • 由于代码中的类型检查,TypeScript有助于避免开发人员通常会遇到的许多痛苦的错误
  • TypeScript鼓励开发人员遵循最佳OOP做法
  • 由于上述原因-TypeScript节省了开发人员时间

有趣的是,此列表中的所有项目都是在没有批判眼光的情况下秉承的信念。 今天,我建议您更仔细地考虑这些要点,并找出它们是否真的对我们有用。

由于TypeScript的主要目标是减少错误的数量,因此让我们决定为什么这是如此重要? 答案很简单:错误越少-我们花在开发人员和测试人员身上的时间就越少-因此,我们将以更少的钱得到有价值的产品,并且它会更早地产生收入。

考虑到这一点,让我们找出TypeScript如何帮助我们提高生产力和效率。

静态输入-一款可解决错误的神奇平板电脑?


TypeScript的主要功能是支持静态键入。 开发人员中普遍认为,动态类型是JavaScript开发人员几乎所有问题的根源。

我想知道坏人在动态打字中会发现什么? 为什么这样的批评之声不属于其他动态语言,例如Python和Ruby? 我只能假设问题不仅仅在于动态类型化,而在于JavaScript中的类型转换。 确实,有时使这样的代码令人惊讶是非常不愉快的:

javascript类型转换

但这是一个问题,而不是JavaScript的较差知识,而不是语言本身。 想象一下,您有一辆强大的跑车。 但是您的驾驶技能足够中等。 您会要求汽车制造商做出改变以降低汽车的最高速度或学习高级驾驶并成为杰出的专业人士吗? TypeScript为我们提供的是限制动态键入的可能性,而不是正确学习JavaScript。

对于动态类型的反对者来说,另一个问题是,如果静态类型如此好,为什么我们还在Java和C#编写的代码中遇到错误? 是的,我们可以在编译阶段捕获这些错误,但是老实说,这还不够。 我们必须遵循SOLID原则和其他最佳实践,以确保质量代码。 再说一遍-与编程语言相比,这更适用于程序员的知识和资格。

TypeScript代码更容易阅读吗?


以下是Redux Thunk的2个示例:

const getUsers = async dispatch => { //... try { const users = await APIService.get('/users') dispatch(successGetUsers(users)) } catch(err) { dispatch(failedGetUsers(err)) } } 

与TypeScript相同:

 const getUsers = (): ThunkAction<void, {}, {}, AnyAction> => async (dispatch: ThunkDispatch<{}, {}, AnyAction>) => { //... try { const users: User[] = await APIService.get('/users') dispatch(successGetUsers(users)) } catch(err) { dispatch(failedGetUsers(err)) } } 

所有这些泛型是什么意思? 为什么其中有2个空物体? 我们应该花多少时间阅读文档以解决所有问题? 嗯,这对于Redux Thunk仍然是正常的,因为它是Redux的一种非常流行的中间件,他们拥有出色的支持团队和文档。 但是,如果我们必须维护没有所有这些的代码怎么办?

不会再有细微的错误了?


在前面的示例中,您看到了TypeScript如何使代码更加冗长。 如您所知,系统越大,越复杂,出错的可能性就越大。 除了可能在JavaScript代码中犯的错误外,我们还必须注意不要在接口中打错字,在泛型中犯错误等。 公平地讲,值得注意的是,编译器将帮助您快速找到并修复此类错误,但是如果没有TypeScript,我们根本不会遇到它们。

遵循OOP的最佳做法


众所周知,如果要编写高质量,易于扩展和维护的代码,则必须遵循最佳实践。 而TypeScript可以帮助我们。 听起来不错,让我们看一下Express中的示例:

userRoute.js

 router.get('/users', (req, res) => { //get users from DB res.json(users) }) router.post('/users', (req, res) => { //create user res.json(userCreated) }) 

userRoute.ts

 class UserRouter { public router = express.Router() public address = '/users' constructor() { this.initRoutes() } initRoutes() { this.router.get(this.address, this.getUsers) this.router.post(this.addressm this.createUser) } getUsers(req: express.Request, res: express.Response) { //get users from DB res.json(users) } createUser(req: express.Request, res: express.Response) { //create user res.json(userCreated) } } 

引起您注意的第一件事是再次编写了更多代码。 我们使用类以OOP风格编写。 然后,我们将不得不实例化这些类。 另外,我们可以使用接口,静态类型和其他构造。 因此,所有这一切都不会变成完全的混乱,我们别无选择,只能使用最佳实践。 这就是所谓的: “鼓励开发人员使用最佳的OOP做法

当开发人员投票支持JavaScript,Python等简单,灵活和动态的语言时,当函数式编程范例显示出其优势以及更优雅,更有效地解决某些问题的能力时(在JavaScript中,我们可以同时使用两种方法),TypeScript促使我们以OOP Java和C#的风格编写老式代码。

总而言之,我们看到TypeScript并没有真正节省我们的时间,也没有保护我们免受大量错误的侵扰,也没有提高生产力。 而且,它需要编写更多的代码,其他配置,类型定义文件,并浪费时间阅读其他文档。 初学者可能会用JavaScript或Ruby编写也许不是理想的但可以正常工作的应用程序,而我们将根据所有原则编写出色的TypeScript应用程序。 然后他将雇用我们重写他的创业公司,在这里我们可以使用TypeScript正确完成所有事情。

看到庞大,冗长和复杂的语言消失,无法与更具活力和简单的语言竞争,然后后者拒绝一切有助于它们快速发展,并努力变得更重,更冗长和更复杂的语言,真是很有趣。

我看到这样的:
好的,我们不再需要Java,我们需要JavaScript。 但是我们不喜欢JavaScript,因此让我们更像Java。 太好了,现在我们拥有Java中的所有内容,而这不是Java。 走吧

Source: https://habr.com/ru/post/zh-CN482702/


All Articles