在学TS
编译环境就不提了
typescript基础类型:boolean,string,array,enum,void,any
多行字符串:给字符串赋值的时候,用“把字符串包起来
- 字符串里面可以直接enter换行了
- 在“里可以使用${}语法,{}里可以是变量也可以是调用函数
- 字符串自动切分
function test(template,name,age){} var myname="Ming"; var getAge=function(){ return 10; } test(`Hello! My name is ${myname}, I`m ${getAge}`)
自动给test函数划分传参:template为一个数组[“Hello! My name is “,”, I`m “,”“],name为”Ming”,age为10
给变量赋予类型
var myname:string="Ming"; var test="test";
像上面那样用:类型,来给变量赋予类型,这里我定义了一个string变量,给这个变量赋予其他类型的值,如10,就会报错。
如果没有设置类型,如上面的test。在你第一次给这个变量赋值的时候,编译器也会自动给这个变量赋一个所给的值的类型。
如果真的想像JS里面的变量一样,让myname又可以等于“Ming”,又可以等于10,可以给他赋一个类型any
除了可以给变量赋类型,也可以给函数返回值,函数的传入参数设置类型可以自己定义一个类
class Person{ name:string; age:number; }
然后就可以定义一个这个类的变量了
函数参数
- 设置默认参数
ts
function test(a:string,b:string="Hello"){}
这样一来,如果只用一个参数调用test,比如test(“Hey”),b就会自动等于Hello - 设置可选参数
ts
function test(a:string,b?:string,c:string="Hello"){}
在参数后面加个?,代表这个参数是可选参数,可以不写(函数里面要分可选参数没写的情况)
可选参数和默认参数都要写在必选参数后面
- 设置默认参数
传任意参数
function fun(...args){}
传进去的参数会形成一个数组args
同样,固定参数的函数也可以穿进去任意参数function fun(a,b){} var args=[1,2,3,4,5]; fun(...args);
有断点的函数
function* test(){ console.log("start"); yield; console.log("finish"); } var func1=test(); func1.next(); func1.next();
定义函数时必须有*,yield用来设置断点。定义完函数后,不能直接调用test(),要定义一个变量等于test(),然后用next()来调用函数,这时候函数会开始执行到下一个断点。
另一种用法:function* getPrice("goods"){ while(true){ yield Math.random()*100; } } var priceGenerator=getPrice("apple"); var limitPrice=15; var price=100; while(price>limitPrice){ price=priceGenerator.next().value; console.log("the generator return ${price}"); } console.log("buying at ${price}");
函数看起来是死循环,但是有一个断点,通过不断对调用next()来调用函数。在这里,每调用一次函数,函数的value就会等于一个0~100的随机数,当目的达到后,就停止调用函数。
析构表达式:
- 从对象里获取特定变量
function getStock(){ return { code:"IBM", price:{ price1:200, price2:400 }, aaa:"xixi"; } } /*var {code,price}=getStock();*/ var (code:codex,price:{price1})=getStock();
函数返回一个对象,可以像注释里面那样直接用两个变量获取里面相同变量名的值。如果想起不一样的变量名,比如函数里面变量名是code,我想用codex来接住code的值,可以用code:codex来实现;如果函数返回的值有嵌套,我想要price这个对象里面的price1,可以用price:{price1}来实现,这样就生成了一个price1变量来接住函数返回值里的price1的值。
- 从数组里获取特定变量
var array1=[1,2,3,4]; var [a_number1,a_number2]=array1; var [b_number1,,,b_number2]=array1; var [c_number1,c_number2,...other]=array1;
用第一行获取代码,a_number1=1,a_number2=1;如果想直接获取数组后面的变量,可以像第二行代码,用若干个”,”,将b_number2放到对应的位置;如果想用一个数组来接住原数组剩下的变量,就用…other的形式,上面执行后,other=[3,4]
- 从对象里获取特定变量
箭头表达式
用来声明匿名函数var (art1,art2) => art1+art2;
如果函数不只一句话,还是得写{}和return
for of循环
旧的循环foreach,for in 新的循环for ofvar myArray=[1,2,3,4]; myArray.desc="four number"; myArray.foreach(value => console.log(value));/*1,2,3,4*/ for(var n in myArray){/*0,1,2,3,desc*/ console.log(n); } for(var n in myArray){/*1,2,3,4,four number*/ console.log(myArray[n]); } for(var n of myArray){/*1,2,3,4*/ console.log(n); } for(var n of myArray){/*1,2*/ if(n>2)break; console.log(n); } for(var n of "four number"){/*f,o,u,r, ,n,u,m,b,e,r*/ console.log(n); }
- foreach和for of都会忽略用户自己新定义的desc属性
- for in里头的n是数组下标或者属性,要通过maArray[n]来调用才能得到里面的值
- for of支持中途break,而且可以对数组以外的对象使用,例如字符串
类的声明和继承
- 声明
class people{ constructor(name:string){ this.name=name; } name; /* constructor(public name:string){ this.name=name; } */ eat(){ console.log("I`m eating"); } }
与C++不同的地方
- 类里面的元素属性默认是public
- 定义方法/元素直接写名字
- 构造函数用constructor
- 可以直接在构造函数的参数里面定义元素(方法:用public或其他关键字定义元素属性),注释的代码跟上面的代码是等价的
- 继承
- 关键字extends,继承都是默认公有继承
- 子类构造函数中必须调用父类的构造函数,用super()调用,调用其他函数则用super.函数名()调用
- 可以用子类变量给父类变量赋值,例:一个变量类型是水果,可以给它赋值成苹果,反过来则不行
多态实现方法与c++一致
- 声明
泛型
class Person{ constructor(){ } } var man:Array<Person>=[];
用Array<>的形式声明一个只能放这个类型的数组
接口
关键字implements- 接口的变量:自动检查类型
当接口作为函数参数的类型,在调用函数时,系统会自动检测当前参数是否符合这个接口类型 - 接口的函数:子类必须实现
当接口声明了方法,一个类继承了这个接口,这个类就必须给接口的所谓方法实例化
- 接口的变量:自动检查类型
模块
一个文件就是一个模块向外提供变量/方法/类/接口
关键字export,在变量/方法/类/接口最前面加上export,它们就可以被其他文件使用/*文件a.ts*/ export var a1; export function func1(){ }
使用其他文件的东西
关键字import,有时候也可以不写,直接调用别的文件的变量,系统会自动添加。/*文件b.ts*/ import {a1,func1} from "./a";/*如果不写,在调用变量a1的时候,系统会自动写这行代码*/ var a2=a1; func1();
装饰器
和angular有关,暂时不懂