JavaScript的痛点

众所周知,前端开发“三剑客”分别是HTML、CSS以及JS,其中JS由于其灵活简单等特点获得了大家的青睐,但是成也萧何败萧何,由于JS设计初衷是浏览器的嵌入式脚本语言,作为脚本语言本身就不像Java等工程语言一样适合大项目开发。之前用JS写过前端程序,由于JS没有命名空间且变量类型为弱类型,当代码写到几千行以上时随着JS文件及变量的增多,程序运行逻辑将会乱成一团,后续开发及维护举步维艰。这些问题是JS本身特点带来的,因为JS在设计初始并没有想到后面的前端开发逻辑会这么复杂,虽然JS号称基于对象的语言,但是却很难模块化。为解决该问题,一些JS模块化框架应运而生,例如Require.js、sea.js等,但这只是权宜之计,并没从根本上解决JS本身语言特性。

解决JS语言本身的问题,看起来只有两种方法,要么JS实现一次重大升级,要么重新设计一种语言来代替JS。但是听起来很美好,实际却不可行。首先JS发展至今,语言本身相对成熟,最多会小修小补,颠覆性的升级不大可能。其次,JS已经拥有了大批的用户及得到了各大浏览器的全面支持,可以看成网页的一种规范标准了,设计一种全新的语言取代JS基本无望。于是,微软采用曲线救国,设计了一种TypeScript,定义为JavaScript的超集。意思就是JavaScript可以做的,我可以做,JavaScript不能做的,我还可以做。同时熟悉JS的迁移到TypeScript上面基本无成本,因为TypeScript全面兼容JavaScript,语法定义等基本类似。

TypeScript方案

TypeScript针对JavaScript弱类型、没有命名空间、难以模块化等缺点对症下药,规定了变量必须是强类型,同时添加any类型兼容JS的弱类型。同时带来了严格的面向对象定义,每一个ts文件需要定义成一个或多个类,同时向外面暴露接口。我把TypeScript比作Java版的JavaScript,很多对象的定义及使用跟Java像极了。这样从语言上解决了JS的问题,编程过程中我只需考虑对象之间的关系而不是JS文件、变量之间的关系,大大提高了前端生产力且提高了程序健壮性及可维护性。

目前三大主流前端框架(谷歌的Angular、Facebook的React.js以及Vue.js)都已经支持TypeScript语言,其中Angular更是如此。它本身就是用TypeScript写出且规定TypeScript为默认编程语言。Angular提供了很多功能强大的库函数,通过引入模版即可快速使用。

TypeScript为什么全面兼容JavaScript及所有浏览器呢?因为它是“始于JavaScript,归于JavaScript”。TypeScript有一个编译器,所有TypeScript程序都可以编译成不同规范标准的JavaScript程序,因此并不改变目前的JS生态。下面是一个用TS写的一个类及编译成JS的例子:

TS定义一个对象:

class BankAccount {
balance = 0;
deposit(credit: number) {
this.balance += credit;
return this.balance;
}
}

经过编译器转换成的JS代码:

var BankAccount = (function () {
function BankAccount() {
this.balance = 0;
}
BankAccount.prototype.deposit = function(credit) {
this.balance += credit;
return this.balance;
};
return BankAccount;
})();

TypeScript——初步认识的更多相关文章

  1. 1.初步认识TypeScript

    简介:typescript是C#之父主导的一门语言,本质上是向Javascript语言添加了可选的静态类型和基于面向对象的诸多特性.相当于javascript的超集,其包含es6.由于是和C#之父创造 ...

  2. 初步学习TypeScript

    使用Visual Studio Code搭建TypeScript开发环境 1.TypeScript是干什么的 ? TypeScript是由微软Anders Hejlsberg(安德斯·海尔斯伯格,也是 ...

  3. 使用Typescript来写javascript

    使用Typescript来写javascript 前几天尝试使用haxejs来写javascript,以获得静态类型带来的益处.虽然成功了,但很快发现将它与angularjs一起使用,有一些不太顺畅的 ...

  4. JavaScript面向对象轻松入门之抽象(demo by ES5、ES6、TypeScript)

    抽象的概念 狭义的抽象,也就是代码里的抽象,就是把一些相关联的业务逻辑分离成属性和方法(行为),这些属性和方法就可以构成一个对象. 这种抽象是为了把难以理解的代码归纳成与现实世界关联的概念,比如小狗这 ...

  5. 前端常用技术概述--Less、typescript与webpack

    前言:讲起前端,我们就不能不讲CSS与Javascript,在这两种技术广泛应用的今天,他们的扩展也是层出不穷,css的扩展有Less.Sass.Stylus 等,js的超集有Typescript等. ...

  6. 初探typescript

    学习任何知识都不是一蹴而就的.typescript也是如此.今天我们来初步的了解一下typescript的安装与编译.以及基础的语法知识. 第一步:安装ts 第二步:在安装好的文件夹里面,写上ts文件 ...

  7. 什么是Less、typescript与webpack?

    前端常用技术概述--Less.typescript与webpack 前言:讲起前端,我们就不能不讲CSS与Javascript,在这两种技术广泛应用的今天,他们的扩展也是层出不穷,css的扩展有Les ...

  8. angular2+typescript在asp.net MVC Web项目上的实现

    网上现在还没有关于angular2+typescript在asp.net mvc web项目上的实现的系统介绍,这里我也只是探索到了一个简单的方式,还有很多问题没能解决.但是能有个好的开头也值得记录一 ...

  9. TypeScript 类型推导及类型兼容性

    类型推导就是在没有明确指出类型的地方,TypeScript编译器会自己去推测出当前变量的类型. 例如下面的例子: let a = 1; 我们并没有明确指明a的类型,所以编译器通过结果反向推断变量a的类 ...

随机推荐

  1. 【译】如何高效的使用 Git

    原文链接 代码昨天还是运行好好的今天就不行了. 代码被删了. 突然出现了一个奇怪的 bug,但是没人知道怎么回事. 如果你出现过上面的任何一种情况,那本篇文章就是为你准备的. 除了知道 git add ...

  2. Android中广播接收者BroadcastReceiver详解

    1. 接收系统的广播步骤 (1)  新建一个类继承BroadcastReceiver 以监听sd卡状态的广播接收者为例 public class SdCardBroadcastReceiver ext ...

  3. 就算会用python画颗心,可你依然还是只单身狗

    :) 标题是开玩笑的,千万别认真. 随着AI的飞速发展,有志于此行的码农也是急剧的增加,带来的就是大家对算法.数学的兴趣也格外升高. 本文的来历是这样,今天某老同事在朋友圈发了一张屏拍,求公式. 看了 ...

  4. Unity资源打包学习笔记(一)、详解AssetBundle的流程

    转载请标明出处:http://www.cnblogs.com/zblade/ 本文参照unity官网上对于assetBundle的一系列讲解,主要针对assetbundle的知识点做一个梳理笔记,也为 ...

  5. 如何在SpringBoot中集成JWT(JSON Web Token)鉴权

    这篇博客主要是简单介绍了一下什么是JWT,以及如何在Spring Boot项目中使用JWT(JSON Web Token). 1.关于JWT 1.1 什么是JWT 老生常谈的开头,我们要用这样一种工具 ...

  6. 小程序开发笔记【一】,查询用户参与活动列表 left join on的用法

    今天在做一个用户活动查询功能的时候,查询参与的活动.正常,使用egg-mysql查询数据一般会这么写 result = await this.app.mysql.select('tb_activity ...

  7. 大数据利器Hive

    序言:在大数据领域存在一个现象,那就是组件繁多,粗略估计一下轻松超过20种.如果你是初学者,瞬间就会蒙圈,不知道力往哪里使.那么,为什么会出现这种现象呢?在本文的开头笔者就简单的阐述一下这种现象出现的 ...

  8. web类协议脚本-飞机订票系统示例

    以下是LR自带的飞机订票系统的Demo,希望能帮助大家. Action() { int iRand; int iTmp; char *strTmpA; char *strTmpB; char *str ...

  9. DSAPI 获取实时统计信息CPU/内存/硬盘/网络

    有时,我们需要获取当前计算机中CPU.内存.硬盘.网络等实时信息,如下图:\ 要实现上述几项信息的获取,通常需要使用Timer控件来间隔获取,以便刷新最新的数据. 本示例中,放一个Timer控件,放一 ...

  10. MySQL 笔记整理(3) --事务隔离,为什么你改了我还看不见?

    笔记记录自林晓斌(丁奇)老师的<MySQL实战45讲> 3) --事务隔离,为什么你改了我还看不见? 简单来说,事务就是要保证一组数据操作,要么全部成功,要么全部失败.在MySQL中,事务 ...