iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >TypeScript应该尽量避免的语法有哪些
  • 896
分享到

TypeScript应该尽量避免的语法有哪些

2023-06-30 05:06:41 896人浏览 八月长安
摘要

今天小编给大家分享一下typescript应该尽量避免的语法有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。避免枚举枚举

今天小编给大家分享一下typescript应该尽量避免的语法有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

避免枚举

枚举提供了一组常量。在下面的例子里,HttpMethod.Get 是字符串 ‘Get’ 的名字。HttpMethod 类型和一个联合类型是一样的,如 'GET' | 'POST'。

enum HttpMethod {  Get = 'GET',  Post = 'POST',}const method: HttpMethod = HttpMethod.Post;method; // Evaluates to 'POST'

下面是支持使用枚举的原因:

假设,我们最终要替换 ‘POST’ 为 ‘post’。我们只要替换枚举的值就能达成这一目的。我们其他的代码因为引用的是 HttpMethod.Post ,所以完全不用改。

现在假设,如果我们用联合类型来实现这个场景。我们定义了联合类型 'GET' | 'POST',然后我们决定把它们改为小写的 'get' | 'post'。现在如果使用 'GET' 或者 'POST' 作为 HttpMethod 的代码就会报类型错误。我们需要把所有的代码手动改一遍。从这个例子来说,使用枚举能简单一些。

这个支持使用枚举的例子可能不是那么有说服力。当我们增加了一个枚举和联合类型的时候,实际上在创建以后是很少更改的。使用联合类型,确实会带来更多的更改成本,但是其实不是一个问题,因为实际上是很少更改的。即便要更改,因为有类型错误,我们并不害怕少改了。

使用枚举的坏处是:

我们需要适应 TypeScript 的语法。TypeScript 应该是 javascript,但是增加了静态类型。如果我们去掉 TypeScript 的类型,我们就应该得到一份完整有效的 JavaScript 的代码。(译者注:这个原因是整篇文章的核心,核心好处之一就是,你可以通过 esbuild 而不是 tsc 完成你的 ts 代码到 js 代码的转换,这个速度差距可能是 10-1000倍。。并且不引入 tsc,代表着少了一个可能出问题的地方。)在 TypeScript 的官方文档中,之前描述 TypeScript 的文档是 “类型级别的扩展”:即 TypeScript 是 JavaScript 类型级别的扩展,所有 TypeScript 的特性不改变运行时的行为。

下面是一个类型级别扩展的例子, TypeScript 的例子:

function add(x: number, y: number): number {  return x + y;}add(1, 2); // Evaluates to 3

TypeScript 的编译器检查了代码的类型。然后生成了 JavaScript 的代码。很幸运,这个过程很简单:编译器只要把类型标注去掉就好了。在这个例子里,只要把 :number 去掉,下面就是完美的 JavaScript 代码:

function add(x, y) {  return x + y;}add(1, 2); // Evaluates to 3

绝大部分 TypeScript 的特性都有这个特性,遵循了类型级别扩展的法则。要得到 JavaScript 代码,只需要去掉类型标准即可以。

然而,枚举打破了这个法则。HttpMethod 和 HttpMethod.Post是一部分的类型。他们应该被去除。然而,如果编译器去除这些代码,就会有问题,因为我们实际上在把 HttpMethod.Post 当成值类型在使用。如果编译器简单删除这些代码,这些代码就不能跑了。

const method = HttpMethod.Post;

TypeScript 的解决方案,就是打破自己的规则。当编译一个枚举的时候,编译器会自己生成一些 JavaScript 代码。其实很少 TypeScript 特性会这样做,这个其实让 TypeScript 的编译模型变得复杂了。因为这些原因,我们建议避免使用枚举,而用联合类型来取代它。

为什么类型级别扩展这个规则这么重要呢?

让我们来看,这个法则在和 JavaScript 和 TypeScript 的工具链生态互动时,会发生什么。TypeScript 的项目都是从 JavaScript 项目继承而来的,所以使用打包工具和编译工具,例如 webpack 和 babel 是很正常的。这些工具都是为了 JavaScript 设计的,即便在今天,依然是关注在 JavaScript 上。每一个工具都有自己的生态。这里有无数的 Babel 和 WEBpack 自有的生态的插件

有可能让所有 Babel 和 Webpack 以及他们的生态插件支持 TypeScript 么?对于大部分 TypeScript 语言来说,实际上类型扩展规则让这些内容支持 TypeScript 很简单。工具只要去掉类型标准,然后对其余的 JavaScript 做剩下的工具就好了。

当对于像枚举这样的特性(包括名字空间 namespaces),这个事儿要复杂一些。不能简单移除枚举。工具需要把 enum HttpMethod { ... } 转译 成合适的 JavaScript 代码,因为 JavaScript 并没有 enum 关键字。

这会带来一些实际的工作量,来处理 TypeScript 自己打破自己的类型扩展法则的问题。像 Babel、webpack 以及他们的生态插件,都是先对 JavaScript 作为设计对象,TypeScript 一般来说只是他们支持的一个功能。很多时候,TypeScript 的支持并不能收到像 JavaScript 一样的支持,就会有很多 Bug。(译者注:考虑 JavaScript 实际上让这些工具和插件的难度小很多,考虑 TypeScript,很多问题其实变复杂了,而且这个复杂度的提升不一定是有价值的。时至今日,依然是 JavaScript 的代码和需求远远大于 TypeScript。即便出于降低这些工具的复杂度的目的,也不应该为了解决 TypeScript 的问题而引入 这些问题。最核心的运行时,依然,以及必然是 JavaScript。)

很多工具的工作主要是在处理变量声明和函数声明,这些事情其实相对都是比较容易做的。但是牵扯枚举和名字空间,就不能仅仅去掉类型标注开始做逻辑了。你当然可以信赖 TypeScript 的编译器,但是很多不常用的工具可不一定考虑这个问题了。

当你的编译器、打包器、压缩器、linter、代码格式器(译者注:其实代码格式器很容易造成 bug,尤其对于 TypeScript)只要发生了一个对于上述的事儿处理有问题,是非常难进行 debug 的。编译器的 Bug 是非常非常难找的(译者注:当出现一个 bug,你会第几直觉认为是编译器的错误呢?其实不使用这些特性,你的代码是不依赖 TypeScript 编译器的,这一点至关重要。)。主要这篇文章的这些文字:经历了几周以后,在我的同事的帮助下,我们对于这个bug牵扯的范畴有了更深的认识。(注意加粗字体)(译者注:我本来花了大约两个月的时间去研究 TypeScript 的装饰器以及装饰器元数据,然后计划把他们加入到我自己的框架里。但是最后沮丧的发现,如果我引入他们,我就没有办法用 esbuild 了,原因是 esbuild 不计划支持 TypeScript 的装饰器元数据,但是支持了装饰器,但是这个支持其实也很新,而我的整个框架其实是以 esbuild 为基石的。我很沮丧,放弃了 TypeScript 的装饰器)(译者注:引入 tsc 是不明智的,因为 tsc 非常非常复杂。实际上,你只用类型的话,在代码编写阶段基本也就完成了绝大部分 tsc 的事情。在最后用 esbuild 一去类型,就可以继续了。)

避免名字空间

名字空间类似 module,但是一个文件里可以有多个名字空间。例如,我们在一个文件里引入了不同名字空间的导出代码,以及它们对应的测试。(我们不建议这样使用名字空间,这里只是作为一个探讨的例子。)

namespace Util {  export function WordCount(s: string) {    return s.split(/\b\w+\b/g).length - 1;  }}namespace Tests {  export function testWordCount() {    if (Util.wordCount('hello there') !== 2) {      throw new Error("Expected word count for 'hello there' to be 2");    }  }}Tests.testWordCount();

名字空间在实践上会造成一些问题。在上面的枚举的例子里,我们看到了 TypeScript 的类型扩展法则。通常,TypeScript 去除类型标注,留下的就是 JavaScript 的代码。

名字空间自然也打破了这一设定。在 namespace Util { export function wordCount ... } 代码里,我们不能仅仅靠去除类型标注就获得 JavaScript 的代码。整个名字空间就是一个 TypeScript 的类型定义!在其他的代码里使用 Util.wordCount(...) 会发生什么呢?如果我们删除 Util 名字空间,然后生成 JavaScript 代码,Util 就没有了。所以 Util.wordCount(...) 也不能工作。

就和枚举一样,TypeScript 也不能仅仅删除名字空间定义,而要生成一些 JavaScript 的代码。

对于枚举,我们建议用联合类型来取代。对于名字空间,我们建议就用 ESM 取代就好了。虽然创建很多文件很麻烦。但是两者能达成的效果是完全一样的。

避免装饰器(对于现在而言)

装饰器是一个可以修改和取代其他函数或者类的方法。这里是一个从 TypeScript 官方文档里找到的装饰器的例子:

// This is the decorator.@sealedclass BugReport {  type = "report";  title: string;  constructor(t: string) {    this.title = t;  }}

@sealed 装饰器暗示了C# 的 sealed 装饰器。这个装饰器可以防止其他类继承这个类。我们可以实现一个 sealed 的函数,然后接受一个类,修改它,让它不能继承这个类。

装饰器一开始是首先在 TypeScript 添加的,然后 JavaScript(ECMAScript)才开始了标准化进程。在 2022 年1月,装饰器依然是一个 ECMAScript 提案阶段 2 的提案。阶段 2 代表在 “draft”(起草)阶段。装饰器提案似乎一直停滞在委员会中:实际上,这个提案是在 2019 年 2 月到达阶段 2 的。

我们建议在 stage 3 前,避免使用装饰器。stage 3 指 “candidate” 阶段,或者 stage 4 “finished” 阶段。

有这样的可能,即 ECMAScript 永远不完成装饰器提案。如果这个提案不完成,装饰器的处境就和枚举、名字空间一样。使用装饰器,就代表着,打破了 TypeScript 的类型扩展规则,并且使用这个特性,很多打包工具,可能都是有问题的。我们不知道多会能让装饰器通过,但是装饰器带来的好处并没有那么大,所以我们选择等待。

一些开源的库,例如有名的 TypeORM,非常重的使用了装饰器。我们承认,如果遵守我们的建议,就不能使用 TypeORM。当然使用 TypeORM 和装饰器有时候是好的选择,但是你应该明白这么做带来的问题,你要知道,目前装饰器的提案的标准化过程可能永远不会结束。(译者注:如果你想享受 esbuild 带来的好处,装饰器用的深就可能是个问题。当然,如果你的业务可以自闭在一套装饰器写的框架里,可能也不是非常大的问题。但是,如果 JS 的装饰器出现,现有的装饰器框架可能就有问题了。)

避免 Private 关键字

TypeScript 有两种方式让一个类型属性私有。老的方法是 private 关键字,这个是 TypeScript 独有的。目前还有一个新的方式:#somePrivateField,这个是 JavaScript 的方式。下面是一个例子:

class MyClass {  private field1: string;  #field2: string;  ...}

我们建议 #somePrivateField 字段。但是这两个方法基本是等同的。但是我们建议更多使用 JavaScript 的特性。

以上就是“TypeScript应该尽量避免的语法有哪些”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: TypeScript应该尽量避免的语法有哪些

本文链接: https://www.lsjlt.com/news/327537.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • TypeScript应该尽量避免的语法有哪些
    今天小编给大家分享一下TypeScript应该尽量避免的语法有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。避免枚举枚举...
    99+
    2023-06-30
  • 关于TypeScript应该尽量避免的语法总结
    目录前言避免枚举避免名字空间避免装饰器(对于现在而言)避免 Private 关键字总结前言 这个文章列举了我们建议尽量避免的 TypeScript 语法。但是因为你的项目的情况,有可...
    99+
    2022-11-13
  • CSS尽量避免使用的技术有哪些
    这篇“CSS尽量避免使用的技术有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“CSS尽...
    99+
    2022-10-19
  • Golang开发中应该避免的错误有哪些
    这篇文章主要介绍了Golang开发中应该避免的错误有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Golang开发中应该避免的错误有哪些文章都会有所收获,下面我们一起来看看吧。Go是一种静态类型的、并发的、...
    99+
    2023-07-05
  • 在Ext.JS应用程序中应该避免的开发方法有哪些
    这篇文章给大家分享的是有关在Ext.JS应用程序中应该避免的开发方法有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1. 过多或不必要的组件嵌套开发人员最常见的错误之一是没理...
    99+
    2022-10-19
  • TypeScript基本的语法有哪些
    本篇内容主要讲解“TypeScript基本的语法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“TypeScript基本的语法有哪些”吧!前端那么多酷炫的东西,真是太好玩了。但是,JavaS...
    99+
    2023-06-16
  • Typescript的基础语法有哪些
    这篇文章主要为大家展示了“Typescript的基础语法有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Typescript的基础语法有哪些”这篇文章吧。一.Ts是什么首先,强类型不允许随意...
    99+
    2023-06-22
  • 在JS中避免过多的使用IF语句方法有哪些
    本篇内容主要讲解“在JS中避免过多的使用IF语句方法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“在JS中避免过多的使用IF语句方法有哪些”吧!1. 三元...
    99+
    2022-10-19
  • 避免JavaScript内存泄露的方法有哪些
    本篇内容主要讲解“避免JavaScript内存泄露的方法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“避免JavaScript内存泄露的方法有哪些”吧!简...
    99+
    2022-10-19
  • sql避免重复数据的方法有哪些
    在SQL中,避免重复数据的方法包括: 主键约束:可以在表的定义中指定一个或多个列作为主键。主键列的值必须唯一且非空,这样可以确保...
    99+
    2023-10-22
    sql
  • Java中避免出现死锁的方法有哪些
    今天就跟大家聊聊有关Java中避免出现死锁的方法有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。避免死锁的技术:加锁顺序加锁时限死锁检测加锁顺序当多个线程需要相同的一些锁,但是按...
    99+
    2023-05-31
    java 死锁 ava
  • 免费的轻量应用服务器有哪些
    Apache Cassandra:这是一个轻量级的基础架构应用服务器,可运行于Memcached、Redis、Nagios等多个数据库之上。 Apache Hadoop:Hadoop是一个开源的分布式数据处理框架,可运行于Memcache...
    99+
    2023-10-27
    服务器 有哪些
  • 使用FlexaddChild()方法时应该注意的问题有哪些
    小编给大家分享一下使用FlexaddChild()方法时应该注意的问题有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!FlexaddChild()方法注意事项在FlexApplication里,是不能直接用Flexad...
    99+
    2023-06-17
  • PHP基础语法、变量和常量的知识点有哪些
    这篇“PHP基础语法、变量和常量的知识点有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“PHP基础语法、变量和常量的知识...
    99+
    2023-06-30
  • 美国服务器网站域名避免被攻击的方法有哪些
    美国服务器网站域名避免被攻击的方法有:1、尽量使用html静态页面搭建网站;2、对美国服务器系统上不必要的软件文件进行删除;3、删掉美国服务器上没有用的数据库表,防止黑客利用数据库查询来进攻;4、定期对美国服务器管理员账号密码进行更换或者加...
    99+
    2022-10-04
  • 轻量应用服务器流量不足怎么解决的方法有哪些
    轻量应用服务器流量不足可能有很多原因导致,以下是一些可能的解决方法: 优化应用程序代码:优化应用程序代码可以减少应用程序服务器的负载压力,例如使用CDN(内容分发网络)等技术,或对应用程序进行缓存,从而提高访问速度。 增加服务器负载:如...
    99+
    2023-10-26
    流量 服务器 方法
  • C语言中const保证变量不被修改的方法有哪些
    小编给大家分享一下C语言中const保证变量不被修改的方法有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在C语言中,const是如何保证变量不被修改的?我们...
    99+
    2023-06-14
  • 自然语言处理中的算法有哪些常见的应用?
    自然语言处理(Natural Language Processing, NLP)是人工智能领域中的重要分支之一,它涉及到对自然语言(人类语言)的理解、处理和生成。在NLP领域中,涉及到很多算法,这些算法在不同的场景下有着不同的应用。本文将介...
    99+
    2023-10-18
    编程算法 numy 自然语言处理
  • 轻量应用服务器搭建数据库的方法有哪些
    在搭建轻量应用服务器时,我们需要考虑以下几个方面: 硬件选择 我们需要选择一种合适的硬件设备来支持我们的应用程序。轻量应用服务器通常需要使用低成本的硬件,如SSD、RAID磁盘等,以降低服务器的成本。此外,还可以选择使用虚拟化技术来降...
    99+
    2023-10-28
    数据库 服务器 方法
  • GO语言有哪些实时响应二维码扫描的方法?
    随着二维码的广泛应用,越来越多的应用程序需要支持对二维码的扫描识别。GO语言作为一种高效、简洁的编程语言,也提供了多种实时响应二维码扫描的方法。本文将介绍GO语言中常用的二维码扫描方法,并提供相应的演示代码。 使用github.com/...
    99+
    2023-07-18
    二维码 响应 实时
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作