类
定义类
class 类名{
//定义实例属性,必须实例化才会有的属性
属性名:类型=值
//加 static 定义静态属性,无需实例化就有的属性
static 属性名:类型=值
// readonly 只读的属性,无法修改
static readonly 属性名:类型=值
//定义方法,直接写就是实例方法,必须实例才可以调用
方法名(){
...
}
//前边加static 定义的方法是静态方法,无需实例化就可以使用
static 方法名(){
...
}
}
构造函数和this
class Dog{
//构造函数会在对象创建时调用
constructor(参数:类型){
this.name=参数
}
}
继承
//继承 extends 父类
class Father{
sayHi(){
}
}
//使用继承后,子类将会拥有父类所有的属性和方法
//通过继承可以将多个类***有的代码写在一个父类中,能供简化代码,提高复用性
//如果在子类中,添加了和父类相同的方法,则子类的方***覆盖父类的方法(方法重写)
class Son extends Father{
sayHi(){
}
}
super关键字
class Son extends Father{
age:number
constructor(name:string,age:number){
//如果在子类中写了构造函数,在子类构造函数中必须对父类构造函数继承
super(name)
this.age=age
}
sayHi(){
//在类的方法中super就表示当前类的父类
super.sayHi()
}
}
抽象类
//以abstract开头的类是抽象类,抽象类和其他类区别不大,只是不能用来创建对象,是专门用来被继承的类
abstract class Father{
name:string
constructor(name:string){
this.name=name
}
//定义抽象方法使用abstract开头,没有方法体,抽象方法只能定义在抽象类中,子类必须对抽象方法进行重写
abstract sayHi():void
}
接口
//接口用来定义一个类结构,用来定义一个类中应该包含哪些属性和方法
//接口也可以当成类型声明来使用
interface myInterface{
name:string
age:number
}
//定义两个重名的接口,可以合并为一个使用
interface myInterface{
gender:string
}
const obj:myInterface{
name:'刘成'
age:12
gender:'男'
}
//接口可以在定义类的时候去限制类的结构
//接口只定义对象的结构而不考虑实际值,在接口中所有的方法都是抽象方法
interface myInter{
name:string
sayHello():void;
}
//定义类时,可以使类去实现一个接口,实现接口就是使类满足接口的要求
class MyClass implements myInter{
name:string
sayHello(){
console.log('Hello!)
}
}
属性的封装
class Person{
//设置私有属性,外部不能访问和修改
private _age:number
constructor(age:number){
this._age=age
}
//定义方法,用来获取age属性
getAge(){
return this._age
}
//定义方法,用来修改age属性
steAge(value:number){
this._age=value
}
//getter方法用来读取属性,setter方法用来设置属性,他们被称为属性的存取器
//TS中设置getter方法的方式
get age(){
return this._age
}
//TS中设置setter方法的方式
set age(value:number){
this._age=value
}
}
class C{
//可以直接将属性定义在构造函数中
constructor(public name:string,public age:number){
}
}
泛型
//在定义函数或者类的时候,如果遇到类型不明确就可以使用泛型
function fn<T>(a:T):T{
return a
}
//可以直接调用具有泛型的函数
let result = fn(a:10)//不指定泛型,TS可以自动对类型进行判断
let result2 = fn<string>(a:'hello')//指定泛型
interface Inter{
length:number
}
//T extends Inter 表示泛型T必须是Inter实现类(子类)
function fn2<T extends Inter>(a:T):number{
return a.length
}
fn2(a:{length:10})
//泛型也可以在类中使用
class MyClass<T>{
name:T
constructor(name:T){
this.name=name
}
}
const mc=new MyClass<string>(name:'刘成')