TypeScript学习笔记
一、介绍
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(num3);//3
console.log(num4);//4
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声明的类、方法和变量。