let isDone: boolean = false; let decLiteral: number = 0xf00d; let names: string = 'boob'; /** 使用模版字符串 */ let name1: string = `gene`; let age: number = 37; let sentence = `Hello, my name is ${name1}I'll be ${age + 1} years old next month `; function error(message: string): never { throw new Error(message); } let str: string = 'nihao'; // 元组类型 let arr1: [number, string] = [123, "aa"]; //枚举类型 enum personm { age = 1, height = 2 } let s: personm = personm.age; // r任意类型 let num: any = 123; let oBox: any = document.getElementById('#oBox'); console.log(oBox); // number 类型, null, undefined let num1: number | null | undefined; num = 1234; //void类型 表示没有任何类型,一般用于 定义 没有返回值的方法 function run(): void { console.log('run'); } // 必须要返回 number类型 function run1(): number { console.log('run'); return 1; } // 任意类型 var arr2: any[] = ['123', 'asd', 123]; //3.1 TS中 函数的定义 function getInfo(name: string, age: number): string { return `${name}:${age}` } console.log(getInfo('tong', 222)); //匿名函数 let getInfo1 = function (name: string, age: number): string { return `${name}:${name}` } //没有返回值的方法 function run2(): void { console.log('run'); } //3.2 TS中 可选参数 //es5的形参 和 实参 可以不一样 //注意:age?:number 可选参数 必须放到最后面 function getInfo2(name: string, age?: number): string { if (age) { return `${name} --- ${age}`; } else { return `${name} ---年龄保密` } } console.log(getInfo2('tong1')) //3.3 默认参数 function getInfo3(name: string, age: number = 22) { if (age) { return `${name} --- ${age}`; } else { return `${name} ---年龄保密` } } console.log(getInfo3('tong2')) //3.4 剩余参数 // function sum(a:number,b:number,c:number,d:number):number{ // return a+b+c+d; // } //三点运算符接受剩余参数 ... function sum(...result: number[]): number { let sum = 0; for (let i = 0; i < result.length; i++) { sum += result[i]; } return sum; } console.log(sum(1, 2, 3, 4, 5, 6, 7, 8)) //3.5 TS 函数的重载 function getInfo4(config: string): string; function getInfo4(age: number): number; function getInfo4(name: string, age: number): string; function getInfo4(str: any, age?: any): any { if (typeof str === 'string') { return '我叫:' + str; } else { return '我的年龄' + str; } } //调用 console.log(getInfo4('tong1')); //正确 console.log(getInfo4(20)); //正确 //错误用法 // console.log(getInfo4(true)); //3.6 箭头函数 this 指向的问题,上下文 setTimeout(() => { // console.log('箭头函数'); }) /**---------------------------es5--------------------------- */ // //es5 里面的继承 // //4.1 简单类 // function person(){ // this.name = 'tong'; // } // var p = new person(); // console.log(p.name); // //4.2 构造函数和原型链里面增加方法 // function person1(){ // this.name= 'tong1'; // this.age = 20; // this.run = function(){ // console.log('tong1在 run') // } // } // person1.prototype.sex='男'; // person1.prototype.work= function (){ // console.log('tong1 在工作 ') // } // var p1 = new person1(); // p1.run(); // //4.3 类里面的静态方法 // function person2(){ // this.name= 'tong2'; // this.age = 20; // this.run = function(){ // console.log('tong2在 run') // } // } // person2.getInfo = function(){ // console.log('person2的静态方法'); // } // person2.getInfo(); // //4.4 继承 原型链和对象冒充 // function webPerson(){ // person1.call(this); /** 这就是对象冒充 使用call 函数 */ // } // var wp = new webPerson(); // wp.run(); /** 对象冒充 只可以 继承构造函数里面的对象和方法 */ // // wp.work();/** 注意! 对象冒充 无法 继承原型链上面的方法 */ // //4.5 原型链继承 // webPerson.prototype = new person1(); // 原型链继承 // var wp1=new webPerson(); // console.log('------------') // wp1.work();/** 实现原型链继承的好处 既可以继承构造函数的属性方法 也可以继承原型链的方法 */ // //4.6原型链继承的问题 实例化子类的时候 无法给父类传参 // //4.7 !!重点 组合继承的方式 原型链加构造函数的 // function person3(name,age){ // this.name= name; // this.age = age; // this.run = function(){ // console.log(this.name + ' 在 run : 原型链加构造函数'); // } // } // person3.prototype.sex='男'; // person3.prototype.work= function (){ // console.log('tong1 在工作 ') // } // function person3C(name,age){ // person3.call(this,name,age); // 对象冒充继承 实例化子类可以给父类传参 // } // person3C.prototype = new person3(); // var newP3= new person3C('tong3C',22); // newP3.run(); /**---------------------------es5 end--------------------------- */ // 5.ts 中定义类 class person4 { name: string; // 属性 前面省略了publick关键词 constructor(n: string) {// 构造函数 实例化出发的方法 this.name = n; } run(): void { console.log(this.name); } } //实例化 var p4 = new person4('tong4'); p4.run(); //5.1 ts 中关于继承的探讨 父类的方法和子类的方法一致 class Web5 extends person4 { constructor(name: string) { super(name);// 初始化 父类的构造函数 } work() { console.log(`${this.name} 在work`) } run() { console.log(`${this.name} :子类的run`) } } var w1 = new Web5('tong5 class extents继承'); w1.run(); w1.work(); //类的 三种 修饰符 /** * public : 公有 在当前类里面,子类,类外面都可以访问 * protected : 保护类 在当前类里面/子类里面可以访问,在类外部无法访问 * private : 私有 找类里面可以访问, 子类,类外面都无法访问 */ // public // protected class person6 { // 如果不加修饰符 默认就是公有 public name: string; // 属性 前面省略了publick关键词 protected name2: string; // 保护类型 private name3: string; // 保护类型 constructor(n: string, m: string, o: string) {// 构造函数 实例化出发的方法 this.name = n; this.name2 = m; this.name3 = o; } run(): void { console.log(this.name); console.log(this.name2); console.log(this.name3); } } class web6 extends person6 { constructor(n: string, m: string, o: string) { super(n, m, o); } work() { console.log(`${this.name}:${this.name2}`); // console.log(`${this.name}:${this.name2}:${this.name3}`); // private 无法访问私有属性 } } let w2 = new web6('t1', 't2', 't3'); w2.work(); console.log(w2.name); // console.log(w2.name2); class person7 { public name7: string; constructor(name: string) { this.name7 = name; }; run() { }; work() { } } //6.0 多态 定义一个方法不去实现,让继承他的子类去继承,每个子类的表现不一样 class person8 { name: string; constructor(name: string) { this.name = name; }; eat() { console.log('多态: 定义的空方法'); } } class person8a extends person8 { constructor(name: string) { super(name) }; eat() { console.log('多态: person8a的方法') } } let per8a = new person8a('person8a'); per8a.eat(); // 6.1 抽象方法 抽象类 :他是提供其他类继承的基类,不能被直接实例化 // 用 abstract 关键字定义抽象类和抽象方法,抽象类中的抽象方法不包含具体的实现并 必须在派生类中实现 // abstract 抽象方法只能放在抽象类 里面 //抽象类和抽象方法用来定义标准~~ 子类的基类 s abstract class person9 { public name: any; constructor(name: any) { this.name = name; }; abstract eat(): any; } class person9a extends person9 { //抽象类的子类必须继承 抽象类的方法 constructor(name: any) { super(name); } eat() { console.log(this.name); } } let p9 = new person9a('抽象类的子类'); p9.eat(); //7.1属性接口 // ts 中定义方法 function printLabel(label: string): void { console.log('printLabel:' + label); } // 对JSON进行约束 function printLabel1(labelJson: { label: string }): void { console.log('printLabel:' + labelJson); } printLabel1({ label: 'a' }); // 正确写法 // 对批量方法传入参数进行约束 接口 //ts 接口 //通过 interface 来定义接口 interface fullName { firstName: string; secondName: string; } function printName(name: fullName) { // 必须传入对象 console.log(name.firstName + '...' + name.secondName) } let obj = { firstName: 'tong1', secondName: 'tong2', age: '111', } printName(obj); //7.2 接口 可选属性 参数数据可以不一样 interface fullName1 { firstName: string; secondName?: string; // 增加 ?号 实现可传可不传 } function printName1(name: fullName1) { // 必须传入对象 console.log(name.firstName + '...' + name.secondName) } let obj1 = { firstName: 'tong1', age: '111', } printName1(obj1); // 7.3 案例 ajax 原生 无兼容 interface configData { type: string; url: string; data?: string; dataType: string; }; function ajax(config: configData) { var xhr = new XMLHttpRequest(); xhr.open(config.type, config.url, true); // 异步 xhr.send(config.data); xhr.onreadystatechange = function () { if (xhr.readyState == 4 && xhr.status == 200) { console.log('seccess') if (config.dataType == 'json') { console.log(xhr.responseText); } else { console.log(xhr.responseText); } } } } ajax({ type: 'GET', url: 'http://a.itying.com/api/productlist', dataType: 'json', data: '' }); // 7.4 函数类型接口 对函数的传入值和返回值进行约束 interface encrypt { (key: string, value: string): string; } let md5: encrypt = function (key: string, value: string): string { //模拟操作 return key + value; } console.log(md5('tongmd', 'bb MD5 函数类型接口')); let sha11: encrypt = function (key: string, value: string): string { return key + value; } // 7.5 可索引接口 通常对数组对象的约束 let arr = ['asd', 123]; let arra1: number[] = [123, 123]; let arra2: Array<number> = [123, 123]; interface userArr { // 对数组约束的接口 [index: number]: string; } let arra3: userArr = ['asd', '123']; // 可索引接口 console.log(arra3[0]); // 7.6 可索引接口 对 对象的约束 interface userObj { [index: string]: string } let userObj: userObj = { name: 'tong1' } // 7.7 可索引接口 对 对类的约束 和抽象类相似 interface Animal1 { name: string eat(str: string): void; } class dog implements Animal1 { name: string; constructor(name: string) { this.name = name; } eat() { console.log(this.name + '的方法执行'); } } let doga1 = new dog('牛牛'); doga1.eat(); // 约束方法的 参数 class cat implements Animal1 { name: string; constructor(name: string) { this.name = name; } eat(food: string) { console.log(this.name + '吃' + food); } } let cat1 = new cat('小猫'); cat1.eat('鱼'); // 8.0 接口的扩展 interface Animal2 { eat(): void; } //实现接口的继承 interface person2 extends Animal2 { work(): void; } class programmer { public name: string; constructor(name: string) { this.name = name; } coding(code: string) { console.log(this.name + code); } } //继承沿用 多个接口 class web2 extends programmer implements person2 { // public name: string; constructor(name: string) { super(name); // 继承 programmer 这个接口 // this.name = name; } eat() { console.log(this.name + 'eat 方法执行'); } work() { console.log(this.name + 'work 方法执行'); } } let newWeb2 = new web2('接口继承实现'); newWeb2.eat(); newWeb2.work(); newWeb2.coding('写ts code'); //9.0 泛型 一个组件中 可以支持 未来未知的数据类型 // 同时返回多种类型数据 string 和number // 可以使用any 来实现 多种数据类型的返回 但是放弃了类型检查 function getData<T>(value: T): T { //定义泛型 return value; } getData<number>(123); //使用泛型 可以限定输入与输出的 数据类型一致 //9.1 泛型类 class minClass { public list: number[] = []; add(num: number) { this.list.push(num); } min(): number { var minNum = this.list[0]; for (let i = 0; i < this.list.length; i++) { if (minNum > this.list[i]) { minNum = this.list[i]; } } return minNum; } } var minN = new minClass(); minN.add(9); minN.add(2); minN.add(1); minN.add(10); console.log(minN.min()); // 类的泛型 class minClass1<T> { public list: T[] = []; add(num: T) { this.list.push(num); } min(): T { var minNum = this.list[0]; for (let i = 0; i < this.list.length; i++) { if (minNum > this.list[i]) { minNum = this.list[i]; } } return minNum; } } let minN1 = new minClass1<number>(); // 实例化类 minN1.add(11); minN1.add(13); minN1.add(2); console.log(minN1.min()); //9.3 泛型接口 interface configFn { (value1: string, value2: string): string; } let getDataFn: configFn = function (value1: string, value2: string): string { return value1 + value2; } console.log(getDataFn('tong3', 'basd')); //泛型接口 写法1 interface configFn1 { <T>(value: T): T; } let getDataFn1: configFn1 = function <T>(value: T): T { return value; } getDataFn1<string>('tong4 泛型接口'); //泛型接口 写法2 interface configFn2<T> { (value: T): T; } function getDataFn2<T>(value: T): T { return value; } let myGetDataFn2: configFn2<string> = getDataFn2; myGetDataFn2('23');// 正确写法 // myGetDataFn2(12); //与指定的类型不一致 错误写法