typescript和js的区别是什么

typescript和js的区别是什么,第1张

typescript和js的区别如下:

一:产生背景不同

1、TypeScript起源于使用JavaScript开发的大型项目。由于JavaScript语言本身的局限性,难以胜任和维护大型项目开发。因此微软开发了TypeScript,使得其能够胜任开发大型项目。

2、JavaScript在1995年由Netscape公司的BrendanEich,在网景导航者浏览器上首次设计实现而成。因为Netscape与Sun合作,Netscape管理层希望它外观看起来像Java,因此取名为JavaScript。

二:功能不同

1、TypeScript是JavaScript的一个超集,而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程。

2、JavaScript是一种基于对象的语言,可以创建对象同时使用现有对象。但是Javascript并不支持其它面向对象语言所具有的继承和重载功能。

三:局限性不同

1、TypeScript扩展了JavaScript的语法,所以任何现有的JavaScript程序可以运行在TypeScript环境中。TypeScript是为大型应用的开发而设计,并且可以编译为JavaScript。

TypeScript支持为已存在的JavaScript库添加类型信息的头文件,扩展了它对于流行库的支持,如jQuery,MongoDB,Nodejs和D3js等。

2、由于JavaScript语言发展的较早,也较为成熟,所以仍有一大批开发人员坚持使用他们熟悉的脚本语言JavaScript,而不是学习TypeScript。

TypeScript代码需要被编译(输出JavaScript代码),这是TypeScript代码执行时的一个额外的步骤。

函数式语言

Elixir

Elixir 比 Erlang 更容易编写,具有 Haskell 等语言的函数式编程概念。Elixir是基于Erlang 虚拟机的,其广为人知的特点是运行低延时、分布式、可容错的系统,并成功用于Web开发与嵌入式软件领域。

Elm

Elm是一种用于构建 Web 应用程序的函数式语言。业内一般认为,它适用于创建高可交互应用,例如复杂的用户界面,开发人员可以通过 Elm 快速编写富有表现力的系统。Elm 也以没有运行时异常而闻名。

PureScript

PureScript是一种可编译为 JavaScript 的纯函数式编程语言。与 Haskell 最相似的是,PureScript 最适合用于开发 Web 应用程序和服务器端应用程序。

PureScript 支持类型推断,与其他语言相比,需要明显类型注释要少得多。

Swift

Swift是一种由苹果公司开发的通用编译编程语言,最早的设想是替代上一代编程语言Objective-C ,过程中结合了Objective-C、Rust、Ruby 和 Python等语言的编程思想。目前Swift用于开发苹果自己的手机、服务器、台式机上的应用软件。

程序语言

Go

Go语言是由谷歌公司创造的类似C风格的语言。Go 比 C++ 或 Java 更简洁,比 Ruby 或 Python 更安全。

一些缺点: 编码要求严格。比如,不能混用符号和无符号整数。还有一个明显的遗漏,Go语言没有泛型和继承。

但Go语言的优势同样明显,简单且易于使用。Go语言擅长于网络和多线程方面的编程。

面向对象语言

DART

Dart同样来自谷歌公司具有C语言风格。Dart可以轻松编写JavaScript、Java for Android、本地机器代码或独立的 Dart 虚拟机。它还可以运行后端代码。

Dart 非常适合使用事件驱动代码构建用户界面。根据Dart 团队成员的说法,Dart的优势:可选的静态类型、最小的编译时错误和强大的内置编辑器。

Pony

Pony是一种基于无数据竞争类型和垃圾收集的语言,并使用 actor 模型以及称为引用功能的东西。

你可以把 Pony 想象成某种“Rust 遇上 Erlang”的复合体,没有锁,高并发是其主要优点。

Pony 的缺点是 API 稳定性低、很少有高质量的第三方库和有限的本地工具。

TypeScript

TypeScript是一个基于 JavaScript 静态类型定义构建,并由微软维护且开源编程语言。Visual Studio Code 或Visual Studio 是推荐的IDE编辑器,微软大厂的用户体验和错误检查也不用怀疑。

复合编程语言

Hack

Hack是一种作为 PHP 方言的 HipHop 虚拟机的编程语言。于 2014 年由Facebook创建,允许程序员同时使用静态和动态类型(也称为渐进类型),这为编码提供了灵活性。

Julia

Julia是一种高级通用编程语言,用于计算科学和数值分析。Julia 以动态类型和可重现的高性能特性而闻名。

Julia 在数据可视化和机器学习等方面都有大量用途。事实上,它被英国保险公司 Aviva 用于风险计算,纽约联邦储备银行用于金融建模,甚至气候建模联盟用于气候变化建模。它拥有Fortran、C++、R、Java、C 、Python等的接口,这使其成为最受追捧的新语言之一。

Kotlin

Kotlin是运行在 Java 虚拟机中的更快、更流畅的 Java 版本。它现在是Android 开发的首选语言。根据 Android 开发者网站显示,程序员正转而采用 Kotlin,因为该语言的样板代码更少,空指针异常更少,并且与 Java 有互 *** 作性。

Kotlin 可用于在 iOS 和 Android 上运行的应用程序、不使用额外运行时或虚拟机。

Nim

Nim是一种优先考虑可读性的静态类型语言。通过结合多种语言的特性,Nim 为程序员提供了速度和易用性。

它带有 JavaScript 后端、分散的包管理、自动内存管理、C 和 C++ 库的绑定以及用于调试的回溯。作为一种语言,Nim 是有限的,但它包含一组元编程功能,如泛型、模板和宏,因此开发人员可以在避免冗长代码的同时以不同的风格工作。

OCaml作为此列表中较旧的语言,OCaml是一种多范式语言——既有函数式、命令式和类型安全,也具有面向对象功能。

OCaml 的一些优势:定义数据类型很容易。默认情况下,所有变量都是不可变的。API 稳定,具有良好的库向后兼容性。该语言还为独立应用程序提供自动内存管理和单独编译。

Reason

如果比JavaScript 更快、更简单且类型安全会怎样?

这就是创建Reason的 Facebook 开发者想要回答的问题。不过,他并没有从头开始构建一种新语言,而是采用了 OCaml,并将其调整为类似于 JavaScript。

Reason使用项目 BucketScript编译为 JavaScript,并且可以访问 80% 的 JavaScript 工具和生态系统。它还可以编译为准系统、iOS、Android 和微控制器。

Red

Red是一种最初旨在克服 Rebol 语言限制的编程语言。Red 于 2011 年推出,受 Rebol、Lua 和 Scala 等语言的影响,对高级和低级编程都很有用。

该语言可用于开发从高级 GUI 到低级 *** 作系统的所有方面。Red 拥有人性化的语法、低内存占用和垃圾收集等优点。

Rust

Rust解决了一些与 Go 相同的问题,如系统级别的线程和进程安全,,但Rust 更像 C 风格的语法

但Rust语言的缺点:静态类型和缺乏垃圾收集

Rust可直接访问内存意味着程序员可以编写低级代码,如 *** 作系统内核。Rust 也非常适合嵌入式设备、网络服务和命令行编写。

蛮多的,下面举几个常见的前端框架。

Angular

简单介绍下Angular, AngularJS诞生于2009年,由Misko Hevery 等人创建,后为Google所收购。是一款优秀的前端JS框架,已经被用于Google的多款产品当中。

从Angular2版本开始,使用TypeScript开发,完全重写框架,性能提升巨大。目前最新版本为810

Ionic

Ionic Framework是一个开源的UI工具包,用Web技术(HTML,CSS和JavaScript)构建高性能的高质量移动和桌面应用程序。Ionic Framework专注于前端用户体验,或应用程序的UI交互(控件,交互,手势,动画)。它易于学习,并与其他库或框架(如Angular)很好地集成,或者可以独立使用而无需使用简单脚本包含的前端框架。目前,Ionic Framework已与Angular正式集成,对Vue和React的支持也正在开发中。

Ant Design of Angular

Ant Design 说是前端框架不太严谨,更像是一个UI组件库,这点和Ionic类似。

Ant Design 由阿里开发,目标是服务于企业级产品的设计体系,基于确定和自然的设计价值观上的模块化解决方案,让设计者和开发者专注于更好的用户体验。

还提供了一系列的工具方便设计和开发人员更快的实现需求,缩短项目周期;国内使用人数较多。PS: 大家还记得去年的圣诞节彩蛋吗?

最后提一下 Vue ,很火的一个前端框架,它不是采用TypeScript语言开发,但可以使用TypeScript配合开发。

Angular,Ionic这些耳熟能详啦。

但Visual Studio Code也是用Typescript写的就强悍了,而且还能移植成Web版本的VS Code

vuejs 30版本

TypeScript 和 JavaScript 是目前项目开发中较为流行的两种脚本语言,我们已经熟知 TypeScript 是 JavaScript 的一个超集。JavaScript 和 TypeScript 的主要差异:

1、TypeScript 可以使用 JavaScript 中的所有代码和编码概念,TypeScript 是为了使 JavaScript 的开发变得更加容易而创建的。例如,TypeScript 使用类型和接口等概念来描述正在使用的数据,这使开发人员能够快速检测错误并调试应用程序

2、TypeScript 从核心语言方面和类概念的模塑方面对 JavaScript 对象模型进行扩展。

3、JavaScript 代码可以在无需任何修改的情况下与 TypeScript 一同工作,同时可以使用编译器将 TypeScript 代码转换为 JavaScript。

4、TypeScript 通过类型注解提供编译时的静态类型检查。

5、TypeScript 中的数据要求带有明确的类型,JavaScript不要求。

6、TypeScript 为函数提供了缺省参数值。

7、TypeScript 引入了 JavaScript 中没有的“类”概念。

8、TypeScript 中引入了模块的概念,可以把声明、数据、函数和类封装在模块中。

编程语言是程序员(开发人员)用来与计算机进行通信的计算机语言。它是用任何特定语言(C、C++、Java、Python)编写的一组指令,用于执行特定任务。编程语言主要用于开发桌面应用程序、网站和移动应用程序。以下是 2022 年最流行的顶级语言。

Python

Python 是由 Guido van Rossum 于 1980 年代后期在荷兰构建的。Python 最初是作为 Java 在行业中的竞争对手而构建的,后来逐渐流行起来。目前,Python 在研究人员和开发人员社区中都非常受欢迎。Python 在 IEEE Spectrum 的语言排名中名列前茅,得分为满分 100。此外,Python 也很受尊重,支持率高达 441%。

Python 几乎适用于任何事物。Django 和 Flask 可用于 Web 开发,而 Jupyter 和 Spyder 等科学工具则用于分析和研究目的。如果您喜欢自动化,Selenium 可以帮助您!该语言的灵活性使 Python 几乎可以在任何地方使用。到目前为止,这些是 Python 中比较流行的产品。Python 的巨大支持基础(仅次于 JavaScript)产生了大量使用该语言的包、框架,甚至是成熟的开源软件。

总的来说,Python 可能对数据科学和机器学习有最大的支持。虽然还有其他语言(如 R 和 MATLAB)提供竞争,但 Python 是数据科学领域的严格统治者。机器学习中使用的大多数框架和库都仅用 Python 编写,如果想要学习机器学习(或一般的数据科学),它可能是最好的语言。

JavaScript

JavaScript 在这一点上几乎是行业领导者。JavaScript 最初于 1994 年作为 Netscape Navigator(当时最好的浏览器之一)的脚本语言而构建,它迅速崛起。直到 2008 年,Google 才在为 Google Chrome 构建 V8 引擎时设计了现代 JavaScript。最初由 Netscape 构建为 Java 的竞争对手,JavaScript 现在在开发领域拥有自己的空间。JavaScript 因其流行而被广泛认为是“互联网语言”。JavaScript 在开发者社区中的支持率最高——高达 677%。一般来说,JavaScript 适用于任何类型的开发活动,如移动应用程序开发、Web 开发、桌面应用程序开发等。

JavaScript 有各种各样的库和框架,可以在开发过程中使用。有用于前端开发的 Angular、Vue 和 React,而 Nodejs 是一种用于后端开发的非常灵活的语言。Jest 和 Mocha 是两个灵活的工具,可帮助设置单元测试以检查功能是否按预期工作。当然,如果您对其中任何一个都不太满意,您可以在前端使用普通的 HTML、CSS 和 JavaScript——就这么简单!由于来自世界各地开发人员的巨大支持,JavaScript 拥有任何语言都可以夸耀的最多数量的支持包。尽管如此,人们继续构建越来越多的包,以增加使用该语言的便利性。

Java

Java 由 James Gosling、Mike Sheridan 和 Patrick Naughton 于 1991 年构建为“Oak”语言,是第一种在全球产生重大影响的语言。虽然新的编程语言使用与 C/C++ 相同的格式,但它融入了某些新思想,使其对更多人更具吸引力。Java 运行的原则是“一次编写,随处运行”——这意味着具有不同硬件和 *** 作系统配置的系统可以轻松运行 Java 程序。

Java 也有各种各样的库和框架,它们在底层使用 Java。Java 用于通过 Spring 和 Hibernate 进行应用程序开发。JUnit 帮助我们为 Java 项目设置单元测试。最重要的是,Java 被用于开发原生 Android 应用程序(Android SDK 本身由 Java 开发工具包或 JDK 提供支持)。Java 可能是大多数人在大学或学校的计算机编程入门课程中被介绍的语言。Java 是用于向大众教授面向对象编程的语言。

Java 在分析和研究领域也备受推崇。Java 唯一的问题是目前该语言的支持包和项目很少。很少有社区参与——这是大多数主流语言都有的。尽管如此,Java 是一种非常容易掌握和学习的语言——这在一定程度上解释了该语言的吸引力。但是,要掌握某种形式的语言确实需要一些时间。

C++

也许人们在本文中可以期待的最令人震惊的答案之一是 C++。尽管是大多数人用来学习数据结构和算法概念的语言,但该语言本身在实际世界中却很少使用。C++ 最初由 Bjarne Stroustrup 于 1982 年创建,作为 C 编程语言的扩展,在接下来的几年中继续声名鹊起。

C++ 可用于分析、研究以及 游戏 内开发。流行的 游戏 开发引擎——虚幻引擎——使用 C++ 作为脚本语言,用于构建 游戏 时可以定义的所有功能。C++ 在软件开发中也有广泛的用途。介于面向对象方法和面向方法方法之间,C++ 可以灵活地使用它生成的软件的性质。在 TIOBE 指数中排名第 4 意味着 C++ 至今仍具有吸引力。C++也广泛用于系统软件开发,比其他语言更容易理解。在 *** 作系统等敏感领域使用 C++ 的主要原因是 C++ 程序的编译时间非常短。

C++ 可能拥有所有语言中最大的学习社区。大多数学生会开始他们的算法课程,用 C++ 构建树、链表、堆栈、队列和许多其他数据结构。当然,只要注意细节,它就很容易上手和学习,也很容易掌握。

Typescript

TypeScript 是 JavaScript 的超集,具有与 JavaScript 几乎相同的应用程序。TypeScript 可用于 Web 开发、移动应用程序开发、桌面应用程序开发等。在 StackOverflow 的最受欢迎语言列表中,TypeScript 是第二受欢迎的语言,受到 671% 的开发人员的喜爱(仅次于 Rust)。

TypeScript 主要是一种用于开发的语言,因此它对科学界没有太大吸引力。但是,由于 TypeScript 的新功能,可以预期它可能会激发更大程度的研究兴趣。该语言的技能上限比 JavaScript 低得多——并且 JavaScript 的许多“难以理解”的行为已在 TypeScript 中得到简化。换句话说,您将头撞到墙上的机会略小。

Golang

新语言正在迅速崛起,新的竞争者即将挑战 JavaScript 和 Python 拥有的宝座。由谷歌(两者的名字中都有“Go”!)主要是为了推进函数式编程的事业,Golang 在短时间内建立了大量的追随者。Golang 已经成为 StackOverflow 第五大最适合学习的语言,受到 623% 的开发人员的喜爱。

Golang 用于多个领域,用于开发强大的软件以及用于 Web 和移动应用程序的后端。目前,Golang 甚至支持一些基本的 Web 开发。虽然它仍处于取代 JavaScript 作为网络语言的阶段,但它正在迅速成为支持下一阶段网络的语言。

Golang 比此列表中的其他语言更难学习。此外,Golang 是一种开源语言,每次重大更新都会频繁更改,因此保持更新是必要的。

Dart

Dart 是工业领域发展最快的语言之一。谷歌在语言领域的贡献显着增加,以与微软的 TypeScript 日益流行的竞争相抗衡。Dart 因其简单性而受到世界各地程序员的高度喜爱。

Dart 用于多平台应用程序开发。与 JavaScript 一样,Dart 用于构建任何人都可以使用电子设备运行的软件。目前 Dart 最著名的用途是 Flutter 框架,Flutter 是一种用于移动应用程序开发的语言。最近的谷歌趋势表明,Flutter 尽管是一个较新的框架,但比 React Native 更受欢迎,后者是业界已经建立的移动应用程序开发框架。

Dart 比 JavaScript 更容易学习,并且能够很好地简化甚至难以理解的案例。随着市场上的 TypeScript 和 Dart 的出现,程序员在选择一种他们真正想要学习的语言时会面临多种选择。

我们都知道NET Core是一个可以用来构建现代、可伸缩和高性能的跨平台软件应用程序的通用开发框架。可用于为Windows、Linux和MacOS构建软件应用程序。与其他软件框架不同,NET Core是最通用的框架,可用于构建各种软件,包括Web应用程序、移动应用程序、桌面应用程序、云服务、微服务、API、 游戏 和物联网应用程序。与其他框架不同,NET Core并不局限于单一的编程语言,它支持C#、VBNET、F#、XAML和TypeScript。这些编程语言都是开源的,由独立的社区管理。

NET Core提供了最先进、最成熟和最广泛的类库、公共API、多语言支持和工具。借助于Visual Studio 2019和Visual Studio Code 这些最先进和最现代的开发工具,使得NET Core成为开发人员最高效的平台之一。

NET Core的 历史

NET Core是由Microsoft开发,目前在NET Foundation(一个非营利的开源组织)下进行管理。NET Core是用C#和C++编写的,并采用MIT协议作为开源协议。第一个版本的NET Core 10是在2016年发布的,功能有限。NET Core 20于2017年8月14日发布。在这个版本中发布的两个核心框架是ASPNET Core20和 Entity Framework Core 20。下一个稳定版本NET Core 21和22于2018年5月和12月发布。NET Core的当前版本为300,并且在2019年5月6日发布了第5个预览版。

下表总结了NET Core的主要里程碑:

版本发布日期关键特征/产品NET Core 106/27/2016VisualStudio 2015 Update 3支持的NET Core的初始版本。net Core 1113/7/2017NET Core Tools 10受VisualStudio 2017支持NET Core 208/14/2017VisualStudio 2017 153,ASPNETCore 20,实体框架20NET Core 215/30/2018ASPNET Core 21,EF Core 21NET Core 2212/4/2018ASPNET Core 22,EF Core 22NET Core 30预览33/6/2019通过VisualStudio2019支持ASPNET Core 30、EF Core30、UWP、Windows窗体、WPF。

NET Core的特点

NET Core的主要特性包括开源、跨平台、现代、灵活、轻量级、快速、友好、可共享,以及为未来的软件开发而构建的。

NET Core是免费和开源的

NET Core平台是免费的、开源的。NET Core的源代码托管在Github上。任何开发人员都可以参与到NET Core的开发。有数千名参与NET Core开发的活跃开发人员正在改进特性、添加新特性以及修复bug和问题。

NET Core由一个名为NET Foundation的独立的非营利组织管理。60,000多名开发人员和3,700多家公司正在为NET生态系统做出贡献。

NET Core是免费的,并且采用MIT和Apache协议作为开源协议。对商业十分友好。不像某Java

NET Core是跨平台的

NET Core支持并运行在Windows、MacOS和Linux *** 作系统上。NET Core跨体系结构(包括x64、x86和ARM)是一致的。可以导入相同的程序集和库,并在多个平台上使用。这些程序集和库都可以使用如下的NET语言进行构建,如:C#、VBNET或F#。

NET Core是可共享的

NET Core使用一种用NET Standard编写的一致API模型,这种模型对所有NET应用程序都是通用的。相同的API或库可以与多种语言的多个平台一起使用。

NET Core是现代的

与一些较旧的框架不同,NET Core旨在解决当今的现代需求,包括移动友好、构建一次在任何地方运行、可伸缩和高性能。NET Core旨在构建针对各种设备的应用程序,包括物联网和 游戏 机。

Visual Studio 2019和Visual Studio Code是世界上最先进和最现代的集成开发环境。这两个IDES都支持当今的现代需求,并且专注于干净、速度和生产力。在这里了解有关VisualStudio 2019功能的更多信息:VisualStudio 2019新特性

NET Core是快速的

NET Core 30 是快速的。与NET Framework和NET Core 22及以前的版本相比,NET Core 30的速度很快。NET Core比其他服务器端框架(如Java Servlet和Nodejs)快得多。

根据TechEmpowers发布的一份报告,NET Core比任何其他框架都要快得多。 TechEmpower基准测试通过对多个Web应用程序框架做如下比较:数据库的单表查询,多表查询,文件访问,数据更新,明文和JSON序列化等任务进行比较。

NET Core是轻量级的

NET Core是轻量级的。NET Core可以包含在您的应用程序中,也可以安装在并行用户、机器范围内或服务器上。NET Core可以部署在Docker容器中。

NET Core是友好的

NET Core通过NET Standard与NET Framework,Xamarin和Mono兼容。 NET Core还支持使用各种流行的Web框架和库,如React,Angular和JavaScript。 TypeScript是NET Core和Visual Studio生态系统的关键组件之一。

我们可以使用NET Core构建哪些类型的应用程序?

NET Core是一个通用的软件开发框架。它允许开发人员构建各种软件,包括Web,桌面,移动,云, 游戏 ,物联网等。

NET Core更适合跨平台需求。NET Core应用程序支持在Windows,Linux和macOS上运行。Linux和macOS上也都支持Microsoft流行的开源代码编辑器Visual Studio Code。VS Code支持代码编辑器的现代需求,包括智能提醒和调试。大多数第三方编辑器(如Sublime,Emacs和VI)都支持NET Core。

Web应用

ASPNET Core是NET Core生态系统的核心组件。ASPNET Core是一个用于构建网页的框架。ASPNET Core基于MVC架构,并提供用于构建Web的通用库。开始使用ASPNET Core

Razor是一个使用C#和TypeScript构建动态网页的新框架。Razor是一种改变 游戏 规则的技术,它允许C#开发人员用C#构建Web应用程序。

移动开发

移动开发是NET Core的关键产品。Xamarin是一套使用C#构建跨平台移动应用程序的工具和库。Xamarin允许开发人员在共享的NET代码库上为IOS、Android、Windows和MacOS构建本地应用程序。

桌面应用程序

NET Core提供各种框架和工具来构建桌面应用程序。Windows窗体、WPF、UWP和Xamarin是构建桌面应用程序的四个主要框架。NET Core还支持这些框架之间的互 *** 作性。

Windows窗体是一种构建Windows桌面应用程序的技术。Windows窗体是NET Framework的首批组件之一。

WPF(Windows Presentation Foundation)是一种较新的构建Windows桌面应用程序的技术。WPF是作为NET Framework版本的一部分发布的

了解有关wpf的更多信息这里

UWP是一种较新的技术,是在Windows 8之后发布的。如今,UWP已经成熟。UWP使用XAML作为表示层(UI)和C#作为后端编程。但是,貌似微软已经宣布了他的死亡。

微服务和容器

微服务是一种新的设计模式,它允许开发人员构建软件服务的小模块,这些模块可以使用定义良好的契约相互通信。微服务使开发、测试和部署应用程序的独立部分更加容易。一旦部署完毕,每个微服务都可以根据需要独立地进行缩放。NET Core支持微服务体系结构,它允许跨平台服务与NET Core一起工作,包括使用NET Framework、Java、Ruby或其他开发的服务。

容器是今天的越野车。NET Core的模块化、轻量级和灵活性使得将NET Core应用程序部署到容器中变得更加容易。容器把一个应用程序的所有的配置文件和依赖关系,包含在一个单独的、小型的和独立的软件部署单元中。容器可以部署在任何平台、云、Linux和Windows上。NET Core与Docker和Azure Kubernetes服务都很好地协作。

云应用程序

云应用程序现在越来越受欢迎。Azure支持各种云应用程序。NET Core和C#应用程序可以通过Visual Studio 2019部署在Azure上。

物联网

物联网应用正在增长。NET Core支持通过UWP框架为运行Windows 10 IoT Core的物联网设备进行物联网开发。UWP可用于构建在由Raspberry Pi,MinnowBoard MAX,DragonBoard 410c等提供支持的物联网上运行的应用程序。

机器学习

机器学习是软件开发人员日益增长的领域。

参考微软官方文档

游戏

Unity是最受欢迎的 游戏 开发框架之一。C#和UWP用于构建移动,桌面,控制台,电视,VR,AR和Web 游戏 。

NET Core 30中的新增的功能有哪些?

最新版本的NET Core 30刚刚发布。C#8和Windows桌面是这个版本的两个主要新增部分。

C#8是C#语言的最新版本。C#8是NET Core的一部分。C#8增加了新功能,包括

Windows桌面是NET Core 30的新增功能,允许开发人员使用Windows窗体,WPF和UWP构建Windows桌面应用程序。

以下是NET Core 30中的其他功能和增强功能列表,

参考文献

TypeScript 是 JavaScript 语言的扩展,它使用 JavaScript 的运行时和编译时类型检查器。

这种组合允许开发人员使用完整的 JavaScript 生态系统和语言功能,同时,还可以在其之上添加可选的静态类型检查、枚举、类和接口。这些额外功能之一是装饰器的支持。

装饰器是一种装饰类成员或类本身的方法,具有额外的功能。

当我们将装饰器应用于类或类成员时,我们实际上是在调用一个函数,该函数将接收被装饰内容的详细信息,然后,装饰器实现将能够动态转换代码,添加额外的功能,并且 减少样板代码。

它们是在 TypeScript 中进行元编程的一种方式,TypeScript 是一种编程技术,使程序员能够创建使用来自应用程序本身的其他代码作为数据的代码。

本教程将分享如何在 TypeScript 中为类和类成员创建自己的装饰器,以及如何使用它们。

它将引导我们完成不同的代码示例,我们可以在自己的 TypeScript 环境或 TypeScript Playground(一个允许我们直接在浏览器中编写 TypeScript 的在线环境)中遵循这些示例。

准备工作

要完成本教程实例,我们需要做如下准备:

在 TypeScript 中启用装饰器支持

目前,装饰器在 TypeScript 中仍然是一个实验性功能,因此,必须先启用它。在本节中,我们将了解如何在 TypeScript 中启用装饰器,具体取决于您使用 TypeScript 的方式。

TypeScript 编译器 CLI

要在使用 TypeScript Compiler CLI (tsc) 时启用装饰器支持,唯一需要的额外步骤是传递一个附加标志 --experimentalDecorators:

tsconfigjson

在具有 tsconfigjson 文件的项目中工作时,要启用实验性装饰器,我们必须将实验性装饰器属性添加到 compilerOptions 对象:

在 TypeScript Playground 中,装饰器默认启用。

使用装饰器语法

在本节中,我们将在 TypeScript 类中应用装饰器。

在 TypeScript 中,我们可以使用特殊语法 @expression 创建装饰器,其中 expression 是一个函数,将在运行时自动调用,其中包含有关装饰器目标的详细信息。

装饰器的目标取决于我们添加它们的位置。 目前,装饰器可以添加到类的以下组件中:

例如,假设我们有一个名为 seal 的装饰器,它在类中调用 Objectseal。 要使用我们的装饰器,我们可以编写以下内容:

这同样适用于所有其他类型的装饰器:

要添加多个装饰器,请将它们一个接一个地添加在一起:

在 TypeScript 中创建类装饰器

在本节中,我们将完成在 TypeScript 中创建类装饰器的步骤。

对于名为 @decoratorA 的装饰器,我们告诉 TypeScript 它应该调用函数 decoratorA。 将调用 decoratorA 函数,其中包含有关如何在代码中使用装饰器的详细信息。

要创建自己的装饰器,我们必须创建一个与装饰器同名的函数。 也就是说,要创建您在上一节中看到的密封类装饰器,您必须创建一个接收一组特定参数的密封函数。 让我们这样做:

传递给装饰器的参数将取决于装饰器的使用位置。第一个参数通常称为目标。

然后,在密封函数中,在目标(即类构造函数)以及它们的原型上调用 Objectseal。当这样做时,不能将新属性添加到类构造函数或其属性中,并且现有属性将被标记为不可配置。

重要的是要记住,目前在使用装饰器时无法扩展目标的 TypeScript 类型。这意味着,例如,你无法使用装饰器将新字段添加到类并使其成为类型安全的。

如果在密封类装饰器中返回了一个值,该值将成为该类的新构造函数。如果想完全覆盖类构造函数,这很有用。

已经创建了第一个装饰器,并将它与一个类一起使用。

接下来,我们将学习如何创建装饰器工厂。

创建装饰器工厂

有时,我们需要在应用装饰器时将其他选项传递给装饰器,为此,我们必须使用装饰器工厂。

在这里,我们将学习如何创建和使用这些工厂。

装饰器工厂是返回另一个函数的函数。他们收到这个名字是因为他们不是装饰器实现本身。

相反,它们返回另一个负责实现装饰器的函数并充当包装函数。通过允许客户端代码在使用装饰器时将选项传递给装饰器,它们在使装饰器可定制方面很有用。

假设,有一个名为 decoratorA 的类装饰器,并且,我们想添加一个可以在调用装饰器时设置的选项,例如,布尔标志,可以通过编写类似于以下的装饰器工厂来实现此目的:

在这里,decoratorA 函数返回另一个带有装饰器实现的函数。 注意,装饰器工厂如何接收一个布尔标志作为它的唯一参数:

我们可以在使用装饰器时传递此参数的值。

请参阅以下示例中突出显示的代码:

在这里,当我们使用 decoratorA 装饰器时,将调用装饰器工厂,并将 someBooleanFlag 参数设置为 true。

然后,装饰器实现本身将运行。 这允许我们根据使用方式更改装饰器的行为,从而,使我们的装饰器易于自定义和通过应用程序重用。

请注意,我们需要传递装饰器工厂预期的所有参数。 如果,我们只是应用装饰器而不传递任何参数,如下例所示:

TypeScript 编译器会给你两个错误,这可能会因装饰器的类型而异。 对于类装饰器,错误是 1238 和 1240:

我们刚刚创建了一个能够接收参数并根据这些参数更改其行为的装饰器工厂。

在下一步中,我们将学习如何创建属性装饰器。

创建属性装饰器

类属性是另一个可以使用装饰器的地方,在这里,我们将了解如何创建它们。

任何属性装饰器都接收以下参数:

目前,没有办法获取属性描述符作为参数。 这是由于 TypeScript 中属性装饰器的初始化方式。

这是一个装饰器函数,它将成员的名称打印到控制台:

当我们运行上面的 TypeScript 代码时,你会在控制台中看到如下打印:

我们可以使用属性装饰器来覆盖被装饰的属性。这可以通过ObjectdefineProperty与属性的新 setter 和 getter 一起使用来完成。

让我们看看如何创建一个名为 的装饰器allowlist,它只允许将属性设置为静态允许列表中存在的值:

首先,我们要在代码顶部创建一个静态许可名单:

然后,我们创建一个属性装饰器:

请注意,我们如何使用 any 作为目标的类型:

对于属性装饰器来说,目标参数的类型可以是类的构造函数,也可以是类的原型,在这种情况下使用any比较容易。

在装饰器实现的第一行中,我们将被装饰的属性的当前值存储到 currentValue 变量中:

对于静态属性,这将设置为其默认值(如果有)。

对于非静态属性,这将始终未定义。 这是因为在运行时,在编译的 JavaScript 代码中,装饰器在实例属性设置为其默认值之前运行。

然后,我们将使用 ObjectdefineProperty 覆盖该属性:

ObjectdefineProperty 调用有一个 getter 和一个 setter。 getter 返回存储在 currentValue 变量中的值。

如果 currentVariable 在允许列表中,setter 会将其值设置为 newValue。

让我们使用您刚刚编写的装饰器。 创建以下 Person 类:

我们现在将创建类的新实例,并测试设置并获取name实例属性:

运行代码,我们应该看到以下输出:

该值永远不会设置为 Peter,因为 Peter 不在允许列表中。

如果我们想让代码更具可重用性,允许在应用装饰器时设置允许列表,该怎么办? 这是装饰器工厂的一个很好的用例。

让我们通过 allowlistOnly 装饰器变成装饰器工厂来做到这一点。

在这里,我们将之前的实现包装到另一个函数中,即装饰器工厂。 装饰器工厂接收一个名为允许列表的参数,它是一个字符串数组。

现在,要使用的装饰器,我们必须通过许可名单,如以下突出显示的代码所示:

尝试运行与之前编写的代码类似的代码,但有新的更改:

输出如下:

显示它按预期工作,personname 永远不会设置为 Peter,因为 Peter 不在给定的白名单中。

现在,我们已经使用普通装饰器函数和装饰器工厂创建了第一个属性装饰器,是时候看看如何为类访问器创建装饰器了。

创建访问器装饰器

在这里,我们将了解装饰类访问器。

就像属性装饰器一样,访问器中使用的装饰器接收以下参数:

但与属性装饰器不同的是,它还接收第三个参数,即访问器成员的属性描述符。

鉴于 Property Descriptors 包含特定成员的 setter 和 getter,访问器装饰器只能应用于单个成员的 setter 或 getter,而不能同时应用于两者。

如果我们从访问器装饰器返回一个值,该值将成为 getter 和 setter 成员的访问器的新属性描述符。

下面是一个可用于更改 getter/setter 访问器的可枚举标志的装饰器示例:

请注意示例中,我们是如何使用装饰器工厂的。 这允许我们在调用装饰器时指定可枚举标志。

以下是如何使用装饰器:

访问器装饰器类似于属性装饰器。 唯一的区别是它们接收带有属性描述符的第三个参数。 现在,我们已经创建了第一个访问器装饰器。

接下来,我们将学习如何创建方法装饰器。

创建方法装饰器

在这里,我们将学习如何使用方法装饰器。

方法装饰器的实现与创建访问器装饰器的方式非常相似。 传递给装饰器实现的参数与传递给访问器装饰器的参数相同。

让我们重用之前创建的同一个可枚举装饰器,但这次是在以下 Person 类的 getFullName 方法中:

如果我们从方法装饰器返回一个值,该值将成为该方法的新属性描述符。

让我们创建一个deprecated的装饰器,它在使用该方法时将传递的消息打印到控制台,记录一条消息说该方法已被弃用:

在这里,我们正在使用装饰器工厂创建装饰器。 这个装饰器工厂接收一个字符串类型的参数,这是弃用的原因,如下面突出显示的部分所示:

deprecationReason 将在稍后将弃用消息记录到控制台时使用。在不推荐使用装饰器的实现中,我们正在返回一个值。当我们从方法装饰器返回值时,该值将覆盖该成员的属性描述符。

我们正在利用这一点为装饰类方法添加一个吸气剂。这样,我们就可以更改方法本身的实现。

但是为什么不直接使用 ObjectdefineProperty 而不是为方法返回一个新的属性装饰器呢?这是必要的,因为,我们需要访问 this 的值,对于非静态类方法,它绑定到类实例。

如果,我们直接使用 ObjectdefineProperty ,将无法检索 this 的值,并且如果该方法以任何方式使用 this ,则当从装饰器实现中运行包装的方法时,装饰器会破坏我们的代码。

在这样情况下,getter 本身的 this 值绑定到非静态方法的类实例,并绑定到静态方法的类构造函数。

然后,在你的 getter 中创建一个本地包装函数,称为 wrapperFn,此函数使用 consolewarn 将消息记录到控制台,传递从装饰器工厂收到的 deprecationReason,然后使用 propertyDescriptorvalue 调用原始方法。

apply(this, args),以这种方式调用原始方法,并将其 this 值正确绑定到类实例,以防它是非静态方法。

然后,我们将使用 defineProperty 覆盖类中方法的值。这就像一种记忆机制,因为对同一方法的多次调用将不再调用 getter,而是直接调用 wrapperFn。

我们现在正在使用 ObjectdefineProperty 将类中的成员设置为将wrapperFn 作为其值。

让我们使用已弃用的装饰器:

在这里,我们创建了一个具有两个属性的 TestClass:一个是静态的,一个是非静态的。 我们还创建了两种方法:一种是静态的,一种是非静态的。

然后,我们将已弃用的装饰器应用于这两种方法。 运行代码时,控制台中会出现以下内容:

这表明这两种方法都使用了包装函数正确包装,该函数将一条消息记录到控制台并说明弃用原因。

你现在已经使用 TypeScript 创建了你的第一个方法装饰器。

接下来,我们将学习如何创建 TypeScript 支持的最后一个装饰器类型,即参数装饰器。

创建参数装饰器

参数装饰器可以用在类方法的参数中。

在这里,我们将学习如何创建一个与参数一起使用的装饰器函数,

接收以下参数:

方法参数列表中参数的索引。

无法更改与参数本身相关的任何内容,因此,此类装饰器仅对观察参数使用本身有用(除非您使用更高级的东西,例如反射元数据)。

这是一个装饰器的示例,它打印被装饰的参数的索引以及方法名称:

然后,你可以像这样使用你的参数装饰器:

运行上述代码应在控制台中显示以下内容:

我们现在已经创建并执行了一个参数装饰器,并打印出返回装饰参数索引的结果。

总结

在本教程中,我们已经实现了 TypeScript 支持的所有装饰器,将它们与类一起使用,并了解了它们之间的区别。

现在可以开始编写自己的装饰器来减少代码库中的样板代码,或者更加自信地使用带有库(例如 Mobx)的装饰器。

以上就是我跟你分享的全部内容,如果你觉得有用,请记得分享给你身边的朋友,也许能够帮助到他。

以上就是关于typescript和js的区别是什么全部的内容,包括:typescript和js的区别是什么、每个开发人员都应该知道的16个顶级新计算机编程语言、有哪些前端框架是使用typescript写的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10075648.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存