typescript类
- readonly 修饰属性/方法 只读,不能修改
statci 修改属性/方法,静态属性/方法,即类属性/方法
每个方法都包含一个隐藏的对象 this ,指当前对象实例
public 公有属性,外部可以访问
private 私有属性,外部不能访问
protected 保护属性,子类可以访问,外部不能访问
属性没有访问修饰符时,默认修饰符是 public - 构造函数 constructor()
- 子类构造函数中调用父类构造函数
super(...arg)
- 抽象类,不能实例化对象,只能用来继承,且子类必须实现父类中的抽象方法,例如:
abstract class Animal{
name : string
abstract sayHello(){}
}
class Dog extends Animal{
sayHello(){
console.log('汪汪汪!')
}
}
- 类的简化定义方式
class A{
constructor(public name:string, public age:number){
this.name = name;
this.age = age;
}
}
接口、类型声明、类、抽象类
type:描述一个对象的类型
接口:用来定义一个类结构,定义类中包含哪些属性和方法,同时接口也可以当作类型声明来使用
type myType = {
name:string,
age:number,
};
interface myInterface{
name: string;
age: number;
};
- 同一名称的类型声明type只能定义一次,但同一名称的接口能定义多次,二次定义同一名称的接口时可以新增属性/方法,实际上最终该接口就是两次定义的合集
- 接口可以在定义类的时候限制类的结构;接口中定义类属性时不能有实际的值;接口中定义类时只考虑结构,不考虑实际值(有点类似抽象类,定义了一个规范);接口所有类方法都是抽象方法;
- 类实现一个接口时,就是使类满足接口的要求
interface MyInter{
name:string;
sayHello():void;
};
class MyClass implements MyInter{
name:string;
constructor(name:string){
this.name = name;
}
sayHello(){
console.log('大家好~');
}
};
ts中属性封装
- 给属性添加 private 修饰符
外部本来应该是不能访问的,但是ts编译器还是能编译通过,这时需要修改 tsconfig.json ,添加设置如下:"noEmitOnError" : true,
- 添加 get 和 set 方法,能控制属性的读写
class Person{
private _name:string;
private _age:number;
constructor(name:string, age:number){
this._name = name;
this._age = age;
}
get name(){
return this._name;
}
set name(value :string){
if(value > 0){ // 控制数据
this._age = value;
}
}
};
const per = new Person("孙悟空",18)
per.name = "猪八戒" // 调用的是 set name(value) 函数
console.log(per.name) // 调用的是get name() 这个函数
泛型
当定义函数或类时,遇到类型不明就可以使用泛型
function fn<T>(a: T):T{
return a;
}
fn(10) // 不指定泛型,ts会自动对类型进行推断
fn<string>('hello') // 指定泛型
function fn2<T, K>(a: T, b: K):T{ // 多个泛型
console.log(b)
return a;
}
fn2<string, number>('白龙马', 12) // 限定泛型类型
// 使用接口限定泛型类型
interface Inter{
length:number
}
function fn3<T extends Inter>(a: T){
return a.length
}
fn3('abc')
fn3({length:10})
fn3(123) // 编译报错