浅谈 C#、Typescript、JavaScript

6,647 阅读6分钟

C#,TS,JS

以前做后端的时候主要是微软的项目为主,随着公司业务发展需要后来转向偏前端项目的开发,今天我到了聊聊微软主导的TypeScript,如你使用过C#或Visual Basic .NET等语言,你会很熟悉。

Typescript 来历

在微软强大的visual studio2012版本未出之前,对Javascript的支持度却如屎一样渣,直到VS2012才有了质的飞越,估计微软内部在做VS升级同时也同样发现了Javascript的缺陷,因为它不适合构建大规模应用开发,我估计同步就那个时候开始Typescript研发,或许更早。微软于2012年9月12日正式发布VS2012版本,紧随其后于2012年10月1日对外公布了Typescript,同时宣布开源。

可以说Typescript到来和微软开源战略离不开,可以说安德斯·海尔斯伯格(Anders Hejlsberg)是开源信徒,参与了.NET 核心引擎 CoreCLR 开源,随后他主导了Typescript开源。

可以说Typescript到来和微软开源战略离不开,可以说安德斯·海尔斯伯格(Anders Hejlsberg)是开源信徒,参与了.NET 核心引擎 CoreCLR 开源,随后他主导了Typescript开源。

Typescript 介绍

TypeScriptJavaScript 的超集,因此任何 JavaScript 都是合法的 TypeScript(非常像 C 和 Objective-C 的关系),TypeScript结合了类型检查和静态分析,显式接口。TypeScript是微软的开源项目,它是由C#之父安德斯·海尔斯伯格(Anders Hejlsberg)发起的。

Typescript做了些什么?

JavaScript 只是一个脚本语言,并非真正设计用于开发大型 Web 应用,JavaScript 没有提供类和模块等概念,对于一个真正的应用开发,TypeScript 扩展JavaScript 并实现了这些特性。

TypeScript主要特点包括:

  • 微软推出的开源语言,使用 Apache 授权协议
  • 增加了静态类型、类、模块、接口和类型注解
  • 可以编译成可读的、标准的 JavaScript
  • 支持开发大规模 JavaScript 应用,支持所有浏览器,主机和操作系统
  • 可用于开发大型应用,并保证编译后的JavaScript代码兼容性
  • 易学和易于理解

Typescript与JavaScript异同点

TypeScript 从核心语言方面和类概念的模行方面对JavaScript 对象模型进行扩展,因此现有的 JavaScript 代码无需做任何修改便可与TypeScript一起使用,TypeScript 通过类型注解提供编译时的静态类型检查。TypeScript可处理已有的 JavaScript 代码,并只对其中的 TypeScript 代码进行编译。

我们来看表:

对比项目 TypeScript JavaScript 注意
基本类型 boolean number string Array Tuple Enum any void null undefined never object string number boolean null undefined symbol TypeScript 中 object 表示的是不是 JavaScript 基本类型的类型
变量声明 let const var let const var 基本一致
接口 interface TypeScript 的核心是类型检查,因此接口充当了命名这些类型的角色
class abstract class readonly … class 无 abstract class 基本一致,但不同的可能发生在未来,TypeScript 使用 private 来定义私有,而 JavaScript 未来极有可能将 #.xx 来定义私有写入标准。TypeScript 支持抽象类,只读等等。
函数 N N 基本一致,参数赋默认值,剩余参数等等,唯一不同的是 TypeScript 支持?可选参数
泛型 Generics 泛型是一个特别灵活的可重用指定不同类型来控制具体类型的类型,TypeScript 支持
枚举 Enums TypeScript 支持的枚举不仅可以默认从 0 开始,也可以赋值具体的字符串,它的操作空间非常大
类型推断 支持 let x = 3; TypeScript 可以通过 3 来推断 x 的类型是 number
高阶类型 & typeof instanceof … TypeScript 独有
Symbols N N Symbol 一样
迭代器 N N 如果实现了 Symbol.iterator ,那么就被视为可迭代的,术语上和 JavaScript 定义的一样
Generators N N 一样
模块系统 N export import 事实上 TypeScript 支持多种多样的模块系统,既有 ESModule 也有 Commonjs 规范,甚至还有 AMD UMD 等
其他 N N 由于 TypeScript 是 JavaScript 的超集,因此 ES2016 之后以及 ESNext 定义的 api 都可以直接在 TypeScript 中使用 并不需要语言支持,至于其他一些比如 JSX Mixins 等等,由于这些不属于 JavaScript 标准因此这里不再复述 。

我们看下TypeScript强大的类型检查

C#和Typescript 异同点

虽然C#Typescript都是微软主导的,而且都是大牛安德斯·海尔斯伯格(Anders Hejlsberg)领导开发的,他们之间有很多共同点,接下来我一个C#程序员的视角来理解Typescript

C# 值类型又细分为简单类型、枚举类型、结构类型和可以为 null 的值类型。 C# 引用类型又细分为类类型、接口类型、数组类型和委托类型。

对比项目 TypeScript C# 说明
数值 number int,long,float,double,byte,char,decimal等 TypeScript和JavaScript一样,所有的数字都是浮点数,都是用number表示,这样也省了很了事,少了C#里类似long转int overflow问题。
布尔类型 Boolean Boolean 基本一样
枚举 enum enum javascript没有enum,这也是TypeScript为此作的补充。功能上和C#差不多; 目的都是为数值提供一个友好的名字,增加代码可读性和可重构性;C#的枚举值toString()会返回枚举的文本值,而TypeScript是数值
字符串 String String 基本一样,不过TS支持用单引号
Symbol Symbol 用来当作唯一的标识,所有新建出来的Symbol都是不同的,不管传进去的值是否一样。非常合适用来做KEY
any any dynamic 二者很相似,dynamic是FrameWork4.0的新特性,dynamic是FrameWork4.0的新特性,编译期默认dynamic对象支持你想要的任何特性
void void void 相同,表示没有任何东西
null null null 基本相同,注意,C#中值类型不能设置为null,必须给一个具体值
undefined undefined
never never 是TypeScript引进的,个人觉得是一种语义上的类型,用来表示永远不会得到返回值,比如while(true){}或throw new Error()之类。
Array Array Array C#里数组可以用结合Linq功能很强大,不过TS也可以用第三方库如lodash来实现
元组 解构 Tuple 类似,C#老版的Tuple有点鸡肋,不过载C#7.0已经更新了,TS解构也同样能实现

总结

这篇文章介绍我的开发历程并介绍了从TypeScript历史和与JavaScript异同点以及C#TypeScript的异同点,从如果你学过java,VB,C#,PHP同时有JavaScript基础掌握就比较容易了,感谢兴趣的同学赶紧上手试试吧。

参考资料

C# TypeScript官方 TypeScript Handbook