TypeScript是JavaScript的超集,扩展了JavaScript的语法,也意味着他支持所有的 JavaScript 语法
它支持ES6规范
强大的IDE支持
是Angular2的开发语言
二、搭建TypeScript开发环境
compiler(编译器)
作用:能将TypeScript编译成JavaScript。
1.安装 Node.js 2.用npm包管理工具下载TypeScript包并在全局环境下安装打开cmd窗口输入
npm install -g typescript
3.使用WebStorm自动编译
Settings -> Languaes & Frameworks -> TypeScript 中Enable TypeScript Compiler打钩。
三、字符串新特性
1.用"`"符号实现多行字符串(键盘上1旁边的那个键 )
2.字符串模板
TypeScript:
var myname = "zzz" ; var getName = function () { return "zzz" ; } console.log(`hello ${myname}`) console.log(`hello ${getName()}`)
JavaScript:
var myname = "zzz" ; var getName = function () { return "zzz" ; }; console.log( "hello " + myname); console.log( "hello " + getName());
相比双引号更加直观,在编写html代码时非常非常好用!
3.自动拆分字符串
当你用字符串模版去调用一个方法的时候,字符串模版中的表达式的值会自动赋给被调用方法的参数。
TypeScript:
var nameStr = "zzz" ; var age = 18 ; function add(temp, name, age){ console.log(temp); console.log(name); console.log(age); } add`my name is ${nameStr}, i 'm ${age}`;
JavaScript:
var nameStr = "zzz" ; var age = 18 ; function add(temp, name, age) { console.log(temp); console.log(name); console.log(age); } (_a = ["my name is ", ", i'm ", ""], _a.raw = ["my name is ", ", i'm ", "" ], add(_a, nameStr, age)); var _a;
四、参数新特性
1.参数类型:在参数名称后面使用冒号来指定参数的类型。(与ActionScript类似)
基本变量类型与js一致
var myname: string = "zzz" ; var alias: any = "haha" ; var man: boolean = true ; function test(name: string):string { return "" ; } class Person{ name:string; age:number; } var zhangsan:Person = new Person(); zhangsan.name = "zhangsan" ; zhangsan.age = 18;
2.默认参数
方法中的参数可以添加默认值,与其他强语言一样,不多说了。
3.可选参数
方法中的参数可以表现为可选(如下b参数,"xxx"会传给a)
必须声明在必选参数的后面
function test(a: string, b?: string, c: string = "" ){ console.log(a); console.log(b); console.log(c); }
test("xxx");
五、函数新特性
1. Rest and Spread
...:用来声明任意数量的方法参数,与强类型语言的语法相似
TypeScript:
function func1(...args){ args.forEach( function (arg){ console.log(arg); }) } func1( 1, 2, 3 ); func1( 5, 5, 5, 5, 5, 5);
JavaScript:
function func1() { var args = []; for ( var _i = 0; _i < arguments.length; _i++ ) { args[_i] = arguments[_i]; } args.forEach( function (arg) { console.log(arg); }); } func1( 1, 2, 3 ); func1( 5, 5, 5, 5, 5, 5);
2.generator函数
控制函数的执行过程,手工暂停和恢复代码执行。
function*:创建generator函数
yield:设置断点
执行函数后赋值于某一变量,并使用next()方法使此次调用在下一个yield处暂停。
function * doSomething(){ console.log( "start" ); yield; console.log( "finish" ); } var fun1 = doSomething(); fun1.next();
3.析构表达式
3.1 针对对象作用:自动将对象中的字段逐个拆分。
使用:var {对象中字段名:别名,对象中字段名:别名...} = 对象。
根据“{}”中的名字(或别名)新建对应变量,并把相应对象中的相应字段值赋予该变量。
TypeScript:
function getStock(){ return { code: "IBM" , price:{ price1: 200 , price2: 400 } } } var {code: a, price, price: {price1, price2}} = getStock(); console.log(a); console.log(price); console.log(price1); console.log(price2);
等同于
JavaScript:
function getStock() { return { code: "IBM" , price: { price1: 200 , price2: 400 } }; } var _a = getStock(), a = _a.code, price = _a.price, _b = _a.price, price1 = _b.price1, price2 = _b.price2; console.log(a); console.log(price); console.log(price1); console.log(price2);
3.2 针对数组
作用:自动将数组中的字段逐个拆分。
使用:var {别名,别名...} = 数组。
根据“[]”中的别名新建对应变量,并把数组中对应位置的值赋予该变量。
TypeScript:
var array1 = [1, 2, 3, 4 ]; var [num1, num2] = array1; var [,,num3, num4] = array1;
var [num, ...others] = array1;
consolo.log(num); //1
console.log(num1); // 1
console.log(num2); // 2
console.log(others);//[2, 3, 4]
JavaScript:
var array1 = [1, 2, 3, 4 ]; var num1 = array1[0], num2 = array1[1 ]; var num3 = array1[2], num4 = array1[3 ]; var num = array1[0], others = array1.slice(1 );
console.log(num); //1 console.log(num1); // 1 console.log(num2); // 2 console.log(num3); // 3 console.log(num4); // 4 console.log(others);
六、表达式和循环
1. 箭头函数(Lambda表达式)
定义: 用来声明匿名函数,消除传统匿名函数的this指针问题。
PS: 跟Java和C#中的Lambda表达式大致相同。
作用: 匿名函数的一种声明方式。
TypeScript:
var sum = (arg1, arg2) => arg1 + arg2; var sum1 = arg1 => { return arg1 + 10 ; }
JavaScript:
var sum = function (arg1, arg2) { return arg1 + arg2; }; var sum1 = function (arg1) { return arg1 + 10 ; };
2. forEach、for in、for of
forEach: 不会遍历数组中的字段(js中数组可以有属性字段)、循环中不可break。
for in: 会遍历数组中的字段、循环遍历的是集合中键值对的键(数组的下标为键,下标对应的值为值)。
for of: 不会遍历数组中的字段。
TypeScript:
var myArray = [1, 2, 3, 4 ]; myArray.desc = "xxx" ; myArray.forEach(value => console.log(value)); // 1 2 3 4 for ( var n in myArray){ // n为下标(集合中键值对的键) console.log(myArray[n]); } // 1 2 3 4 xxx for ( var n of myArray){ // n为下标(集合中键值对的键) console.log(myArray[n]); } // 1 2 3 4
JavaScript:
var myArray = [1, 2, 3, 4 ]; myArray.desc = "xxx" ; myArray.forEach( function (value) { return console.log(value); }); // 1 2 3 4 for ( var n in myArray) { console.log(myArray[n]); } // 1 2 3 4 xxx for ( var _i = 0, myArray_1 = myArray; _i < myArray_1.length; _i++ ) { var n = myArray_1[_i]; console.log(myArray[n]); } // 1 2 3 4
七、面向对象特性
与Java大致相同
TypeScript:
class Person{ sex; // 构造函数 constructor(public name:string){ } eat(){ console.log( "im eating" ); } } var p1 = new Person("batman" ); p1.sex = true ; p1.eat(); var p2 = new Person("superman" ); p2.sex = true ; p2.eat();
JavaScript:
var Person = ( function () { // 构造函数 function Person(name) { this .name = name; } Person.prototype.eat = function () { console.log( "im eating" ); }; return Person; }()); var p1 = new Person("batman" ); p1.sex = true ; p1.eat(); var p2 = new Person("superman" ); p2.sex = true ; p2.eat();
模块
定义: 可以帮助开发者将戴安分割为可重用的单元。开发者可以自己决定将模块中的哪些类、方法或变量暴露出去供外部使用,哪些资源只在模块内使用。
模块a:
模块b:
引用模块a,可以使用模块a中用export声明的类、方法和变量。