TypeScript 学习笔记

113 阅读4分钟

TS 类型的声明

// 声明一个变量a, a的类型只能是number类型(如果是其他类型会报错) 
let a: number

// 声明后的变量可以直接赋值
let b: string = "123"

// 直接进行变量的赋值,ts 会自动进行判断声明(这里的 c = 123 会报错,因为会自动判断c 的类型为boolean)
let c = true
c = 123

// ts 中也可以对函数进行类型的声明(声明函数的参数a,b为number,且只有2个参数,函数的返回类型也是number,三者有一个不符合都会报错)
function sum(a:number, b:number):number{
	return a + b
}

TS 类型

基本类型

这里的基本类型就和上面所述的 string number的基本类型声明一样

字面量

// 声明一个变量a a的值只能为10,类似声明一个常量
let a:10

// 声明一个变量b b的值可以是number也可以是string
let b:number | string

any

// 声明一个变量c c的值可以是任何类型(声明为该类型表示跳过ts的类型检测)
let c:any

// 如果给一个变量没有复制那么ts将自动解析该变量为 any 类型
let d;

unknow

// 声明一个变量e,e的值是未知的(unknow 与 any 不同的是 any可以直接赋值给任何类型的变量,但是unknow 类型不可以)
let e:unknow

let s:string
s = c; //正确
s = e; //错误

类型断言 as

let e:unknow
e = 'hello'
let s:string

// 报错,因为 unknow 类型不可以直接赋值
s = e
 
// 正确,表示e就是一个string类型的变量不需要进行检查了
s = e as string
s = <string>e

void

// 用表示一个函数的返回值为空 可以返回null和undefeated
function sum():void{

}

never

// 用表示一个函数不会返回任何结果
function sum():never{
	throw new Error("函数报错")
}

object

// 语法:{属性名:属性值,属性名:属性值}
// 属性名后面加?表示该属性是可选的
let a: {name:string, age?:number}

// 表示该对象只有一个name属性是必须的。
let b:{name:string, [propName:string]:any}

// 于此相同的是function
let c:(a:number,b:number)=>number

array

// 语法:类型[]
//		<Array>类型
let d: number[]
let e: <Array>string

元组

// 表示固定长度的数组
// 语法:[类型,类型,类型]
let a: [string,number,string]
a = ["123",123,"456"]

enum 枚举

// 当一个值的范围是在多个值之间选择的时候适合用枚举类型
enum Gender{
	male = 1,
	female = 0
}
let person:{name:string ,gender:Gender}
person = {
	name:"xiaoming",
	gender:Gender.male
}

类型别名

type myType = 1 | 2 | 3
let a:myType;
a = 1 // true
a = 4 // false

/*
	1. 使用 classs 关键字来声明一个类
	2. 类中主要包含2个部分,一个属性,一个是方法
*/
class Person{
/*
	属性分为实例属性和静态属性
	实例属性需要通过实例对象去调用
	let p = new Person()
	p.name
	静态属性只能通过类去访问
	Person.name
	当然还其他属性如:readonly 只读属性等
 */
	name:string = "xiaoming";
	age:number = 3;
// 方法同属性
    sayHello(){
		console.log("hello")
  }
}
/*
	在我们实际使用过程中一般不希望我们的属性值是一个固定值,而是更具不同的实例对象获取不同的值
*/
class Person{
	name:string;
	age:number;

	// 	构造函数会在对象的创建时期调用,应此我们一个在实例化该类的时候赋值
	constructor(name:string,age:number){
		// 这里的this知道实例对象
		this.name = name;
		this.age = age;
    }
    sayHello(){
		console.log("hello")
  }
}

let p = new Person(name:'xiaoming',age:8);

继承 extends

使用extends 关键字实现对一个类的继承,子类可以使用父类的方法和属性,但是需要注意的是,子类中出现和父类相同的方法会对父类的方法进行覆盖,当子类需要添加一个属性时,需要在构造函数中使用super()实现对父类的引用。

class Person{
   public name: string; // 写或什么都不写都是public
   public age: number;

   constructor(name: string, age: number){
       this.name = name; // 可以在类中修改
       this.age = age;
   }

   sayHello(){
       console.log(`大家好,我是${this.name}`);
   }
}

class Employee extends Person{
   constructor(name: string, age: number){
       super(name, age);
       this.name = name; //子类中可以修改
   }
}

接口 interface

接口用来定义一个类的结构,用来规定实现的这个类需要包含哪些属性和方法,同时接口也可以用来当成类型声明去使用(但是接口可以去重复声明,重复声明时相当于合并)。

interface FullName{
	firstName:string;
	lastNae:string;
}
function sayName(name:FullName){
	console.log(name.firstName+"--"name.lastName)
}