TypeScript学习笔记

一、静态类型

使用了静态类型,变量的类型不能改变,类型的属性和方法也跟着确定。

interfaceXiaoJieJie{

uname:string,

age:number

}

constxiaohong:XiaoJieJie={

uname:'xiaohong',

age:18

}

基础静态类型

对象类型:对象、数组、类、函数

constcount:number=918;

constmyName:string='cq';

// null, undefined, boolean, void, symbol 基础静态类型

// 对象类型、数组、类、函数

constxiaojiejie: {

name:string,

age:number

}={

name:'cq',

age:23

}

constxiaojiejies:string[]=['cq1','cq2','cq3']

classPerson{ }

constdajiao:Person=newPerson()

constjianxiaojiejie: ()=>string=()=>{

return'dajiao'

}

二、类型注释和类型推断

类型注释

letcount:number;

count=123

functiongetTotal(one:number,two:number) {

returnone+two;

}

consttotal=getTotal(1,2);

类型推断

letone=1;

lettwo=2;

constthree=one+two;

constXiaojiejie={

name:'nancy',

age:23,

}

每个变量,每个对象的属性都是固定的,如果能推断就让它推断,推断不出来的时候需要进行类型注释。

三、函数的参数定义和返回值定义

给函数的返回值加上类型注释

// 数值类型返回值的函数

functiongetTotal5(one:number,two:number):number{

returnone+two;

}

// 没有返回值的函数

functionsayHello():void{

console.log('hello');

}

// never返回值类型(执行不完)

functionerrorFunction():never{

thrownewError();

console.log('hello');

}

functionforNever():never{

while(true) { }

console.log('hello');

}

函数参数为对象对,需要解构对类型进行注释

// 参数为对象

functionadd({one,two}: {one:number,two:number}) {

returnone+two;

}

四、数组类型的定义

一半数组类型的定义

constnumberArr:number[]=[1,2,3];

conststringArr:string[]=['1','2'];

constundefinedArr:undefined[]=[undefined];

constarr: (number|string)[]=[1,'111'];

数组中对象类型的定义

constxiaogege: {name:string,age:number}[]=[

   {

name:'Jarry',

age:10,

   },

   {

name:'Tom',

age:8,

   }

]

类型别名 type alias

typePeople={name:string,age:numebr};

classLady={

name:string;

age:number;

}

constxiaogege:People[]=[

   {

name:'Jarry',

age:10,

   }

]

constxiaojiejie:Lady[]=[

   {

name:'Nancy',

age:15,

   }

]

五、元组的使用和类型约束

元组可以把数组中每个元素类型的位置固定

constxiaojiejie: [string,string,number]=['dajiao','teacher',28]

元组的使用

constarray: [string,string,number][]=[

['a','b',12],

['c','d',19],

]

六、interface 接口

接口的定义和使用

interfaceBoy{

name:string;

age:number;

height:number;

waistline?:number;// 可选值

}

constscreenResume=(boy:Boy)=>{

const{age,name,height}=boy;

age<30&&height>180&&console.log(name+' pass');

(age>30||height<180)&&console.log(name+' refuse');

}

constgetResume=(boy:Boy)=>{

const{age,name,height,waistline}=boy;

console.log(name+'年龄是'+age);

console.log(name+'身高是'+height);

waistline&&console.log(name+'腰围是'+waistline);

sex&&console.log(name+'性别是'+sex);

}

constboy={

name:'Tom',

age:28,

height:185,

}

screenResume(boy);

getResume(boy);

接口可以约束类

interfaceBoy{

name:string;

age:number;

height:number;

waistline?:number;// 可选值

[propname:string]:any,// key字符串类型,value任意类型

say():string,// say()方法,返回值为string类型

}

classXiaogegeimplementsBoy{

name:'LiuTao';

age:26;

height:183;

say: ()=>{

return'hello';

   },

}

接口的继承

// 接口的继承

interfaceTeacherextendsBoy{

teach():string

}

constboy={

name:'Tom',

age:28,

height:185,

waistline:100,

sex:'男',

say: ()=>{

return'hello';

   },

teach: ()=>{

return'teach';

   }

}

七、类的概念和使用

类的基本使用和继承

classLady{

content='hi';

sayHello() {

returnthis.content;

   }

}

classXiaojiejieextendsLady{

// 重写父类的方法

/*  sayHello() {

        return 'hello';

    } */

// 重写并调用父类的方法

sayHello() {

returnsuper.sayHello()+' 你好';

   }

sayLove() {

return'love you';

   }

}

constNancy=newXiaojiejie();

console.log(Nancy.sayHello());

console.log(Nancy.sayLove());

八、类的访问类型

public  公共的,默认访问类型,允许在类的内部和外部被调用

private  私有的,只允许在类的内部被调用

protected 被保护的,允许在类的内部及继承的子类中使用

classPerson{

protectedname:string;

publicsayHello() {

console.log(this.name+' say hello')

   }

}

classTeacherextendsPerson{

publicsayBye() {

console.log(this.name+'say bye')

   }

}

九、类的构造函数

定义一个类,类里面有一个name,不给值。使用构造函数在new出对象的时候,通过传递参数的形式,name赋值。

classPerson{

publicname:string

constructor(name:string){

this.name=name;

   }

}

constperson=newPerson('cq')

// 简单的写法

clasaPerson{

constructor(publicname:string){}

}

类继承中的构造器写法,在子类中使用构造函数必须用super调用父类的构造函数。如果需要传值,也必须进行传值操作。就算是父类没有构造函数,子类也要使用super()进行调用,否则会报错

classPerson{

constructor(publicname:string){}

}

classTeacherextendsPerson{

constructor(publicage:number){

super('cq')

   }

}

constteacher=newTeacher(18)

十、TypeScript 类的Getter、Setter、static和readonly使用

用private封装一个属性,然后通过Getter和Setter的形式来访问和修改这个属性。

classXiaojiejie{

constructor(private_age:number){


   }

getage(){

returnthis._age-10;

   }


setage(age:number){

this._age=age+3;

   }

}

constdajiao=newXiaojiejie(28);

console.log(dajiao.age)18

// _age是私有的,类的外部没办法改变,可以用setter属性进行改变

dajiao.age=25;

console.log(dajiao.age);18

类中的static,用static声明的属性和方法,不需要进行声明对象,就可以直接使用。

classGirl(){

staticsayLove(){

return'Love you';

   }

}

console.log(Girl.sayLove());

readonly只读属性,在实例化对象时赋值,以后不能再更改。

classPerson{

publicreadonly_name:string;

constructor(name:string){

this._name=name;

   }

}

constperson=newPerson('cq');

// 报错,因为_name是只读属性,不能修改

person._name='cqq''

console.log(person._name);

十一、抽象类

抽象类跟父类很像,都需要继承,但是抽象类中有抽象方法。继承抽象类必须实现抽象方法才可以,抽象类的关键词是abstract,里面的抽象方法也是abstract开头。

abstractclassGirl{

abstractskii()// 没有具体的实现

}

classTeacherextendsGirl{

skill(){

console.log('教师')

   }

}

classWaiterextendsGirl{

skill(){

console.log('服务员')

   }

}

十二、联合类型和类型保护

联合类型:可以认为一个变量可能有两种或者两种以上的类型。

interfaceWaiter{

anjiao:boolean;

say: ()=>{};

}

interfaceTeacher{

anjiao:boolean;

skill: ()=>{};

}

functionjudgeWho(animal:Waiter|Teacher){

// 报错:因为animal可能是Waiter可以能是Teacher

animal.say();

}

类型保护-类型断言

interfaceWaiter{

anjiao:boolean;

say: ()=>{};

}

interfaceTeacher{

anjiao:boolean;

skill: ()=>{};

}

functionjudgeWho(animal:Waiter|Teacher){

if(animal.anjiao){

(animalasTeacher).skill()

  }

else{

(animalasWaiter).say();

   }

}

类型保护-in语法

functionjudgeWho(animal:Waiter|Teacher){

if("skill"inanimal){

animal.skill();

}else{

animal.say();

   }

}

类型保护-typeof语法

functionadd(first:string|number,second:string|number){

// 报错:这两个参数可能是数字,也可能是字符串,不做类型保护就相加会报错。

returnfirst+second;

}

functionadd(first:string|number,second:string|number){

// 使用typeof解决

if(typeoffirst==='string'||typeofsecord==='string'){

return`${first}${second}`;

   }

returnfirst+second;

}

类型保护-instanceof语法

// 如果类型保护一个对象,使用instanceof语法

classNUmberObj{

count:number;

}

functionaddObj(first:object|numberObj,second:object|numberObj){

if(firstinstanceofNumberObj&&secondinstanceofNumberObj){

returnfirst.count+second.count;

   }

return0;

}

十三、TypeScript  函数泛型-难点

generic  通用、泛指的意思,泛型使用<>定义。

给join方法一个泛型,名字随便起,后边的参数也是用泛型的名称。在正式调用这个方法的时候,具体指明泛型的类型。

functionjoin<T>(first:T,second:T){

return`${first}${second}`;

}

join<string>('baidu','com')

泛型中数组的使用,第一种直接使用[],第二种使用Array<泛型>

functionmyFun<ANY>(paramsANY[]){

returnparams;

}

// 第二种写法

functionmyFun<ANY>(paramsArray<ANY>){

returnparams;

}

myFun<string>['123','234'];

多个泛型的定义

functionjoin<T,P>(first:T,second:P){

return`${first}${second}`

}

join<number,string>(1,'2')

泛型的类型推断

functionjoin<T,P>(first:T,second:P){

return`${first}${second}`

}

join(1,'2');

十四、TypeScript  类中泛型-难点

classSelectGirl<T>{

constructor(privategirls:T[]){}

getGirl(index:number):T{

returnthis.girls[index];

   }

}

constselectGirl=newSelectGirl()<string>['q','d','h']

泛型中的继承

interfaceGirl{

name:'string';

}

classSelectGirl<TextendsGirl>{

constructor(privategirls:T[]){}

getGirl(index:number):string{

returnthis.girls[index].name;

   }

}

constselectGirl=newSelectGirl([

{name:'a'},

{name:'b'},

{name:'c'},

])

console.log(selectGirl.getGirl(1));

泛型的约束

classSelectGirl<Textendsnumber|string>{

constructor(privategirls:T[]){}

getGirl(index:number):T{

returnthis.girls[index];

   }

}

constselectGirl=newSelectGirl<string>(['a','b','c')

console.log(selectGirl.getGirl[1]);

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容

  • 1.ts介绍微软开发的开源编程语言,是js的超集。2.安装 3.运行 4.ts中的数据类型 布尔类型,数字类型,字...
    Mr无愧于心阅读 358评论 0 2
  • 安装: npm install -g typescript 运行: tsc helloworld.ts -----...
    5550d794ea4f阅读 600评论 0 0
  • ## 为什么要用ts? 提供的静态类型系统,大大增强代码的 可读性 以及 可维护性; 提供最新和不断发展的java...
    笨人不能懒阅读 228评论 0 0
  • 数据类型基本数据类型(undefined和null可以赋值给任何基础类型) let str: string = '...
    xinmin阅读 243评论 0 1
  • 写在前边 通过npm安装typescript,在根目录下执行命令ts init,或运行>任务>执行ts构建会生成一...
    DoEmpty阅读 129评论 0 0