TypeScpt是一款编程软件,主要的目的就是扩展JavaScpt功能,让用户在编辑代码的时候获得更多帮助,新版优化很多内容,不匹配的参数不再相关,以前可以通过将不相关的参数与类型相关联来将它们相关联any。通过TypeScpt 4.1的更改,该语言现在可以完全跳过此过程。这意味着某些情况下可分配现在将失败,但是这也意味着某些重载解决方案也将失败。例如,util.pmisifyNode.js中的重载解析可能会在TypeScpt 4.1中选择其他重载,有时会在下游引起新的或不同的错误!
TypeScpt软件功能
TypeScpt通过添加类型来扩展JavaScpt。
通过了解JavaScpt,TypeScpt可以节省您捕获错误的时间并在运行代码之前提供修复。
任何浏览器,任何作系统,任何运行JavaScpt的地方。完全开源
1、JavaScpt等
TypeScpt是一种开源语言,它通过添加静态类型定义在JavaScpt(全球最常用的工具之一)上构建。
类型提供了一种描述对象形状的方法,提供了更好的文档,并允许TypeScpt验证您的代码是否正常工作。
在TypeScpt中,编写类型可以是可选的,因为类型推断使您无需编写其他代码即可获得大量功能。
2、您可以信任的结果
所有有效的JavaScpt代码也是TypeScpt代码。您可能会遇到类型错误,但这不会阻止您运行生成的JavaScpt。尽管您可以采取更严格的行为,但这意味着您仍然可以控制。
通过TypeScpt编译器或Babel将TypeScpt代码转换为JavaScpt代码。此JavaScpt干净,简单的代码可在运行JavaScpt的任何地方运行:在浏览器中,在Node.上或您的应用程序中。
3、逐步采用
采用TypeScpt不是一个二进制选择,您可以首先使用Doc注释现有的JavaScpt,切换一些文件以供TypeScpt,并随着时间的推移准备好代码库以进行完全转换。
TypeScpt的类型推断意味着您无需注释代码,除非您想要更高的安全。
TypeScpt软件特色
1、始终如一的好工具
通过处理TypeScpt中的许多编辑器集成,您可以在许多编辑器中获得一致的使用体验。
这使您可以轻松地在Visual Studio,Visual Studio Code,Nova,Atom,Sublime Text,Emacs,Vim,WebStorm和Eclipse之类的编辑器之间切换。
TypeScpt的编辑器集成支持JavaScpt,因此您很可能已经在使用TypeScpt。
2、与标准一起发展
TypeScpt团队为TC39委员会做出了贡献,这些委员会帮助指导JavaScpt语言的发展。
当新功能达到阶段3时,便可以将其包含在TypeScpt中。
例如,TypeScpt团队拥护诸如可选链,空位合并运算符,抛出表达式和RegExp匹配索引之类的建议。
TypeScpt教程
模板文字类型
TypeScpt中的字符串文字类型使我们可以对需要一组特定字符串的函数和API进行建模。
这非常好,因为字符串文字类型基本上可以对我们的字符串值进行拼写。
我们还喜欢将字符串文字用作映类型中的属名称。从这个意义上讲,它们也可用作构建基块:
但是在另一个地方,字符串文字类型可以用作构建块:构建其他字符串文字类型。
这就是TypeScpt 4.1带来模板文字字符串类型的原因。它具有与JavaScpt中的模板文字字符串相同的语法,但用于类型位置。当将它与具体文字类型一起使用时,它将通过串联内容来产生新的字符串文字类型。
当工会担任替代职位时会发生什么?它产生可以由每个联合成员表示的每个可能的字符串文字的。
除发行说明中的可爱示例外,还可以使用此功能。例如,用于UI组件的多个库提供了一种在其API中同时指定垂直和水平对齐方式的方法,通常同时使用单个字符串(例如)同时指定两者"bottom-ght"。之间具有垂直对准"top","middle"和"bottom",并与水平地对准"left","center"以及"ght",有其中每一个前者字符串与每个使用短划线后者串的连接9个可能的字符串。
尽管有很多此类API的示例,但由于我们可以手动将其编写出来,因此这仍然只是一个玩具示例。实际上,对于9个字符串,这可能很好。但是,当您需要大量字符串时,应考虑提前自动生成它们,以节省每次类型的工作量(或只是使用stng,这将使理解更为简单)。
一些实际价值来自动态创建新的字符串文字。例如,想象一下一个makeWatchedObjectAPI,该API接受一个对象并生成一个几乎相同的对象,但是具有一种on检测属变化的新方法
请注意,您不仅可以on监听事件"firstNameChanged",还可以监听事件"firstName"。我们将如何输入?
这样,当我们赋予错误的属时,我们可以构建出错误的东西!
我们还可以对模板文字类型做一些特殊的事情:我们可以从替换位置推断出来。我们可以使最后一个示例通用,以从ntName字符串的各个部分推断出相关属。
在这里,我们将其制成on通用方法。当用户使用字符串调用时"firstNameChanged',TypeScpt将尝试为推断正确的类型K。为此,它将与K内容匹配"Changed"并推断stng "firstName"。一旦TypeScpt弄清楚了,该on方法就可以获取firstName原始对象的类型,stng在这种情况下就是这种情况。同样,当我们打电话"ageChanged"时,它发现该属的类型age是number)。
推理可以以不同的方式组合,通常是对字符串进行解构,并以不同的方式对其进行重构。实际上,为了帮助修改这些字符串文字类型,我们添加了一些新的实用程序类型别名,用于修改字母中的大小写(即转换为小写和大写字符)。
新的类型别名是Uppercase,Lowercase,Capitalize和Uncapitalize。前两个转换字符串中的每个字符,后两个仅转换字符串中的第一个字符。
映类型中的键重映
就像刷新一样,映类型可以基于任意键创建新的对象类型
或基于其他对象类型的新对象类型。
到目前为止,映类型只能使用您提供的键来产生新的对象类型。但是,很多时候您希望能够根据输入来创建新键或过滤掉键。
这就是为什么TypeScpt 4.1允许您使用newas子句重新映映类型中的键。
使用此新as子句,您可以利用模板文字类型之类的功能轻松地基于旧名称创建属名称。
您甚至可以通过产生来过滤掉键nr。这意味着Omit在某些情况下您不必使用额外的帮助程序类型。
递归条件类型
在JavaScpt中,常见的功能是可以扁平化并建立任意级别的容器类型。例如,考虑.then()对的实例的方法Pmise。 .then(...)解开每个pmise,直到找到不是“ pmise-like”的值,将该值传递给回调。在s上还有一个相对较新的flat方法Array,可以深入了解要展平的深度。
出于所有实际意图和目的,不可能在TypeScpt的类型系统中表达这一点。尽管有一些破解方法可以实现,但最终这些类型看起来非常不合理。
这就是为什么TypeScpt 4.1减轻了对条件类型的一些限制-以便他们可以对这些模式进行建模。在TypeScpt 4.1中,条件类型现在可以立即在其分支中引用自身,从而更容易编写递归类型别名。
例如,如果我们想编写一个类型来获取嵌套数组的元素类型,则可以编写以下deepFlatten类型。
同样,在TypeScpt 4.1中,我们可以编写一个Awaited类型来深度解包Pmises。
请记住,尽管这些递归类型功能强大,但应负责任地谨慎使用。
首先,这些类型可以完成很多工作,这意味着它们可以增加类型时间。尝试以Collatz猜想或斐波那契数列对模型进行建模可能很有趣,但不要.d.ts在npm的文件中附带该模型。
但是,除了计算量大之外,这些类型还可能在足够复杂的输入上达到内部递归深度限制。当达到该递归限制时,将导致编译时错误。总的来说,最好不要使用这些类型,而要在更实际的示例中编写失败的东西。
索引访问(--noUncheckedIndexedAccess)
TypeScpt具有称为索引签名的功能。这些签名是一种向类型系统发出信号的信号,用户可以访问任意命名的属。
在上面的示例中,Options具有一个索引签名,该索引签名表示尚未列出的所有已访问属都应具有type stng | number。这对于假定您知道自己在做什么的乐观代码来说通常很方便,但是事实是JavaScpt中的大多数值并不支持每个潜在的属名称。例如,大多数类型将没有Math.random()像前面示例中那样通过创建的属键的值。对于许多用户而言,这种行为是令人不快的,并且感觉它没有利用对的严格--stctNullChecks。
这就是TypeScpt 4.1附带一个名为的新标志的原因--noUncheckedIndexedAccess。在这种新模式下,每个属访问(如foo.bar)或索引访问(如foo["bar"])都被认为可能是未定义的。这意味着在我们的最后一个示例中,opts.yadda将具有类型stng | number | undefined而不是just stng | number。如果需要访问该属,则必须先其存在,或者使用非空的断言运算符(后缀!字符)。
使用的结果之一--noUncheckedIndexedAccess是,即使在边界的循环中,也更严格地对数组的索引。
如果不需要索引,则可以使用for-of循环或forEach调用来遍历各个元素。
该标志对于捕获越界错误可能很方便,但是对于很多代码来说可能很嘈杂,因此该--stct标志不会自动启用它。但是,如果您对这个功能很感兴趣,则可以随意尝试并确定它是否适合您团队的代码库!
paths 没有 baseUrl
使用路径映是相当普遍的-通常是为了更好地导入,通常是为了模拟monorepo链接行为。
不幸的是,指定paths启用路径映还需要指定一个名为的选项baseUrl,该选项也允许相对于指定符路径进行访问baseUrl。这通常还导致自动导入使用较差的路径。
在TypeScpt 4.1中,paths可以在不使用的情况下使用该选项baseUrl。这有助于避免其中一些问题。
checkJs 暗示 allowJs
以前,如果您要启动一个选中的JavaScpt项目,则必须同时设置allowJs和checkJs。这是体验中的一点烦人的摩擦,因此默认情况下checkJs即刻暗示allowJs。
反应17个X工厂
TypeScpt 4.1通过两个用于编译器选项的新选项来支持React 17的即将发布的功能jsx和jsxs工厂功能jsx:
react-jsx
react-jsxdev
这些选项分别用于生产和开发编译。通常,一个选项可以从另一个扩展。例如,tsconfig.json用于生产的构建可能如下所示:
用于开发的版本可能如下所示:
Doc@see标签的编辑器支持
现在,Doc标签@see标签在TypeScpt和JavaScpt的编辑器中具有更好的支持。这使您可以在标记后的虚线名称中使用定位定义之类的功能。例如,在下面的示例中,仅对Doc注释上first或其中的定义进行定义即可C:
重大变化
lib.d.ts 变化
lib.d.ts可能具有一组更改的API,这可能部分是由于DOM类型是如何自动生成的。一个特定的更改是Reflect.enumerate已删除,因为它已从ES2016中删除。
abstract 成员无法被标记 async
标记为的成员abstract不能再标记为async。解决方法是删除async关键字,因为调用者只关心返回类型。
any/unknown在虚假的位置中传播
以前,对于像这样的表达式foo && somethingElse,foowas的类型为anyor unknown,该表达式的整体类型为somethingElse。
例如,以前x这里的类型是{ somePp: stng }。
但是,在TypeScpt 4.1中,我们更加谨慎地确定这种类型。由于对左侧的类型一无所知&&,因此我们传播any并unknown向外传播,而不是右侧的类型。
我们看到的最常见的模式通常是在与booleans的兼容时,尤其是在谓词函数中。
通常,适当的解决方法是从切换foo && someExpression到!!foo && someExpression。
resolve的参数在中不再是可选Pmise的
在编写如下代码时
您可能会收到类似以下的错误:
这是因为resolve不再有可选参数,因此默认情况下现在必须为它传递一个值。通常,使用Pmises会捕获合法的错误。典型的解决方法是为其传递正确的参数,有时还要添加一个显式的类型参数。
但是,有时resolve()确实确实需要不带参数地调用。在这些情况下,我们可以给出Pmise一个显式的void泛型类型参数(即,将其写为Pmise)。这利用了TypeScpt 4.1中的新功能,其中潜在void尾随参数可以变为可选。
TypeScpt 4.1附带了一个快速修复程序,以帮助解决此问题。
条件价差创建可选属
在JavaScpt中,对象传播(如{ ...foo })不会对虚假值进行作。因此,在代码中{ ...foo },foo如果是null或,将被跳过undefined。
许多用户利用此优势“有条件地”传播属。
在此,如果pet定义了,其属pet.owner将散布-否则,没有属将散布到返回的对象中。
的返回类型copyOwner以前是基于每个点差的联合类型:
这精确地模拟了作将如何发生:如果pet定义了,Person将显示fm的所有属;否则,将不会在结果上定义它们。这是一场全有或全无的行动。
但是,我们已经看到这种模式达到了极致,单个对象具有数百个扩展,每个扩展可能会添加数百或数千个属。事实证明,由于各种原因,这最终会变得非常昂贵,并且通常不会带来太多收益。
在TypeScpt 4.1中,返回的类型有时使用全选属。
这样最终会表现更好,并且总体上也表现得更好。
近期热门