TypeScript学习历程

一、typeScript 的安装和编译

 全局安装:  npm install -g typescript 
 手动编译:  tsc hellowWord.ts
 开发工具编译:
	 **VSCode:**  
	 	1. cd 本项目   
	 	2. 运行 tsc --init 
	 	3.打开 tsconfig.json 配置 outDir:"./js"'
	 	4. 终端--配置任务;
	 	5. 终端--运行任务 监视tsconfig.json
	 	6. 在html中引入编译后的js文件

二、typeScript 数据类型

定义数据必须指定类型

布尔类型 Boolean
	var flag:boolean = true
字符串类型 string
	var str:string = '133'
数字类型 number
	var num:number= 123
数组类型 array
两种方式定义数组:
1.  var arr:number[] = [1,2,3]  // 定义元素都是number类型
2.  var arr:number[] = [1,2,3]  // 定义元素都是number类型
3.  var arr:any[] = [1,2,3,'a', 'b','c']
元祖类型 tuple (属于数组的一种)
给数组中的每一个位置指定类型, 必须一一对应
 let arr:[number,number, string] = [1,2,'a']
枚举类型 enum
	enum Flag {success=1, error=2}
	let f:Flag = Flag.success
	console.log(f) // 1
	
	如果标识符没有赋值, 取得就是下标
	enum Color {blue, red, 'orange'}
	let c:Color = Color.red
	console.log(c) // 1
	
	enum Err {'undefined'=-1, 'null'=-2, 'success'=1}
	let r:Err = Err.success
	console.log(r) // 1
	
任意类型 any
	给变量随意指定类型; 
	var num:any = 123
	var num:any = '123'
	var num:any = true
	var Box:any = document.getElementById('box')
null 和 undefined
	定义未赋值就是undefined
	var num:number
	console.log(num) // num 报错
	var nums:number|undefined	
		
	var num:null
	num = null;
	
	当一个元素可能是number  null undefined 时:
	var num:number | null |undefined
	num = 123
	console.log(123)
void 类型
	定义方法没有返回值时使用:
	function run():void{
		console.log('run')
	}
	方法有返回值时定义返回值的类型
	function num():number{
		return 34;
	}
never类型
	是null和undefined的子类型, 代表从不会出现的值 ; 生命nerver变量只能被nerver类型所赋值
	var a:undefined
	a = undefined
	var b:null
	b = null
	
	var a : nerver
	a=123 // 错误
	a = (()=>{
		throw new Error('error')
	})()

三、函数

函数的定义
	**有返回值时,定义返回值的类型**
	var fun = function():number{
		return 123;
	}
	function numFun():number{
		return 456
	}
函数传参
**要指定参数的数据类型**
function add(a:number, b:number):void{
	console.log(a+b);
}
function add(a:number, b:number):number{
	return a+b
}

var add = function add(a:number, b:number):number{
	return a+b
}
方法可选参数
	// 不传的参数加问号, 且必须配置到参数列表后面
	function  getInfo(name:string, age?:number):string{
		if(age){
			return `${name} --- ${age}`
		}else{
			return `${name} --- 未知`
		}
	}
	console.log(getInfo('zhangsan',30))
	console.log(getInfo('zhangsan'))
方法默认参数
	function  getInfo(name:string, age:number=20):string{
		if(age){
			return `${name} --- ${age}`
		}else{
			return `${name} --- 未知`
		}
	}
	console.log(getInfo('zhangsan',30))  // zhangsan -- 30
	console.log(getInfo('zhangsan')) // zhangsan -- 20
剩余参数
	function sum(...result:number[]):number{
		let i = 0;
		result.forEach(item => {
			i += item
		})
		return i;
	}
	console.log(sum(1,2,3,4))
	function sum(a:number, ...result:number[]):number{
		result.forEach(item => {
			a += item
		})
		return a;
	}
	console.log(sum(1,2,3,4,5))
函数重载
	function getInfo(name:string):string;
	function getInfo(age:number):number;

替换:
	function getInfo(str:any):any{	
		if(typeof str == 'string'){
			return '字符换'+str'
		}else{
			return '数字'+str
		}
	}

多参数:
	function getInfo(name:any, age?:any):any{	
		if(age){
			return name + age
		}else{
			return  name
		}
	}
箭头函数
	setTimeout(()=>{
		do some thing....
	},1000)

ES5中的类
**ES5中类的操作**
	function Person(){
		this.name = '张三';
		this.age = 20;
		this.run = function(){
			alert('run')
		}
	
	}
	Person.prototype.sex = '女'
	// 静态方法直接调用
	Person.work = function(){
		console.log('work')
	}
	Person.prototype.self = function(){
		console.log('self')
	}
	let p = new Person();
	alert(p.name)
	p.self()  
	对象冒充实现继承 只能继承构造函数中的属性和方法, 无法继承原型链上的属性和方法
	function Web(){
		Person.call(this) 
	}
	let w = new Web();
	console.log(w.name)
	console.log(w.self()) // w.self is not a function

原型链继承

// 原型链实现继承 继承构造函数和原型链上中的属性和方法  但是实例化子类的时候没办法给父类传参
	function Person(name, age){
		this.name = name;
		this.age = age;
		this.run = function(){
			alert('run')
		}
	}
	Person.prototype.sex = '男'
	Person.prototype.work = function(){
		alert(name+', '+age)
	}
	function Webs(name, age){
		
	}
	Web.prototype = new Person();
	let ww1 = new Web('历史',20) // 实例化子类的时候没办法给父类传参
	let ww2 = new Web('控制',20)
	ww.self()
	console.log()
***原型链+构造函数混合继承***
// 原型链实现继承 继承构造函数和原型链上中的属性和方法
function Person(name, age){
	this.name = name;
	this.age = age;
	this.run = function(){
		alert('run')
	}
}
Person.prototype.sex = '男'
Person.prototype.work = function(){
	alert(name+', '+age)
}
function Webs(name, age){
	**Person.call(this,name,age)**
}
Web.prototype = new Person(); 或 Web.prototype = Person.prototype;
let ww1 = new Web('历史',20) // 实例化子类的时候没办法给父类传参
ww.self()

TypeScript 中的类
定义类:

	class Person {
		name: string;
		constructor(n:string){
			this.name = n;
		}
		run():void{
			console.log('run')
		}
	}
	
	let p = new Person('张三');
	p.run();
类的继承:

	class Person{
		name: string;
		constructor(n:string){
			this.name = n
		}
		run():string{
			return `${this.name} run`
		}
		getName():string{
			return this.name
		}
		setName(n:string):void{
			this.name = n
		}
	}
	let p = new Person('jon')
	console.log(p.getName()) // jon
	p.setName('李四')
	console.log(p.getName()) // 李四
	console.log(p.run()); // 李四 run
	
	class Web extends Person{ 
		constructor(n:string){
			super(n) // 初始化父类的构造函数
		}
		work():string{
			return `${this.name} work`
		}
		run():string{
			return `${this.name} son`
		}
	}
	let web = new Web('web');
	console.log(web.run()) // web son
	console.log(web.work()) // web work 

类的修饰符

public 共有类型 在类里面 子类 类外部都可以访问
protected 保护类型 在类里面\子类里面可以访问,类外部不能访问
private 私有类型 在类里面可以访问, 子类及类外部不能访问

	class Person{
		public name: string;
		constructor(n:string){
			this.name = n
		}
		run():string{
			return `${this.name} run`
		}
		getName():string{
			this.self('self') // private 只能再父类中使用
			return this.name
		}
		protected setName(n:string):void{
			this.name = n
		}
		private self(n:string):void{
			 console.log(`${n}`)
		}
	}
	
	class Web extends Person{ 
		constructor(n:string){
			super(n) 
		}
		work():string{
			return `${this.name} work`
		}
		run():string{
			this.setName('张斌') // protected 在子类中使用
			// this.self() // private 在子类及外部不能使用
			return `${this.name} son`
		}
	}
	let web = new Web('web');
	console.log(web.name) //web
	console.log(web.work()) // web work
	console.log(web.run()) //张斌 son
	// web.setName('张斌') // protected类型  外部不能使用
静态属性 和静态方法
	class Person{
		public name: string;
		static age: number=20;
		constructor(name:string){
			this.name = name;
		}
		run(){// 实例方法  : 实例化以后才调用
			alert('run')
		}
		static work(){ // 静态方法  无法直接调用类里的属性, 将属性改为静态属性
			alert('work'+this.age)
		}
	}
	
	Person.work() // 静态方法调用
	let p = new Person('张三');
	p.run(); // 实例方法调用

多态
	class Person{
		name:string;
		constructor(name:string){
			this.name = name
		}
		eat(){
			console.log('eat')
		}
	}
	class Man extends Person{
		constructor(name: string){
			super(name)
		}
		eat(){
			return this.name+'man'
		}
	}
	class Women extends Person{
		constructor(name: string){
			super(name)
		}
		eat(){
			return this.name +'women'
		}
	}

抽象类 abstract

不能使用new进行实例化
抽象方法只能放在抽象类里面
抽象类的子类必须实现抽象类的抽象方法

	abstract class Person{
		public name:string;
		constructor(name:string){
			this.name = name
		}
		abstract eat():any
	}
	 class Man extends Person{
		constructor(name: string){
			super(name)
		}
		eat(){
			return this.name+'man'
		}
	}
	class Women extends Person{
		constructor(name: string){
			super(name)
		}
		eat(){
			return this.name +'women'
		}
		work(){
			return this.name+'work'
		}
	}
	let man = new Man('男')
	console.log(man.eat())
	let women = new Women('女')
	console.log(women.eat())
	console.log(women.work())

接口 interface

行为和动作的规范, 对批量方法进行约束

接口定义
	 interface FullName{
		 firstName: string;
		 lastName: string;
	 }
	 function printName(name: FullName){
		 return `${name.firstName}--${name.lastName}`
	 }
	 let obj = {
		firstName:'李',
		lastName:'三',
		age: 20
	 }
	 // 传入的参数必须包含 firstName lastName
	 console.log(printName(obj))
接口可选属性
	interface FullName{
		firstName: string;
		lastName?: string;
	}
	function printName(name: FullName){
		return `${name.firstName}--${name.lastName}`
	}
	console.log(printName({
		firstName:'李', 
	 }))  // 李--undefined	
定义ajax请求数据的接口
	// 定义接口参数
	 interface Config {
		 url: string;
		 type: string;
		 data?: string;
		 dataType: string;
	 }
	 function ajax(config:Config){
		 let xhr = new XMLHttpRequest();
		 xhr.open(config.type, config.url,true)
		 xhr.onreadystatechange = function(){
			 if(xhr.readyState == 4 && xhr.status == 200){
				 console.log('success')
				 if(config.dataType == 'json'){
					 JSON.parse(xhr.responseText)
				 }else{
					xhr.responseText
				 }
			 }
		 }
		 xhr.send(config.data)
	 }
	// 调用
	 ajax({
		 type:'get',
		 url:'http:www.baidu.com',
		 data:'ab',
		 dataType:'json'
	 })
定义函数接口
	interface encrypt{
		 (key:string,value:string):string
	 }
	
	let md5:encrypt = function(key:string,value:string):string{
		 return key + value
	}
	
	console.log(md5('zhangsan', '加墨')) //zhangsan加墨
可索引接口

对数组和对象的约束 , 不常用

	// 对数组的约束
	interface useArr {
		 [index:number]:string;
	 }
	 var arrs:useArr[] = ['1','2']
	 console.log(arrs[0])
	
	// 对对象的约束
	 interface useObj{
		 [index: string]:any
	 }
	 var objs:useObj = {
		 name:'张三',
		 age:20
	 }
	 console.log(objs)
类类型接口
	// 定义后类接口后必须实现里面的属性和方法; 不实现会报 'person错误实现类Person'
	interface Person {
		 name: string;
		 eats(str: string):void;
	 }
	 class person implements Person{
			name: string;
			constructor(name: string){
				this.name = name
			}
			eats(str:string){
				console.log(str +', '+this.name)
			}
	 }
	
	 let p = new person('man女')
	 p.eats('nid')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值