ts简答

111 阅读4分钟

01_类的简介 使用class 关键字定义一个类 对象中主要包含了两个部分,属性和方法

class Person {

直接定义属性是 实例属性,需要通过对象的实例去访问

name: string = '小李';

age: number = 18;

属性前面使用static 关键字可以定义类属性(静态属性)

可以通过类去访问

static age:number = 19;

readonly属性 只读不可修改

readonly cals = '二班

定义方法

如果方法以static开头则方法就是类方法。可以直接通过

类去调用。

sayHel() { return 22 }

}

const per = new Person();

02_构造函数

class Dog {

name: string;

age: number;

constructor 构造函数

构造函数会在对象创建时调用

constructor(name:string,age: number) {

在实例方法中,this 就表示当前的实例

在构造函数中当前对象就是当前创建的那个对象

可以通过this向新创建的对象中添加属性

this.age = age;

this.name = name;

}

bark() {

console.log(this,'===hh')

return '汪汪!'

}

}

const dog = new Dog('小李',12);

(function(){

class Animal {

name: string;

age: number;

constructor(name:string,age:number) {

this.name = name;

this.age = age;

}

sayHel() {

return '叫!'

}

} // 使dog类继承animal类

animal 被称为父类,Dog被称为子类

使用继承后,子类拥有父类的属性和方法

通过继承可以将多个类中共有的代码写到一个父类中

这样只需要写一次即可让所有的子类都同时拥有父类的属性和方法

如果在子类中添加一个与父类中相同的方法,会覆盖调父类的方法,被称为方法的重写

class Dog extends Animal{

sayHel() {

return ${this.name} 在叫!

}

}

// 定义猫的类

class cat extends Animal{

}

const dog = new Dog('小哈',12);

const Dat = new cat('sdi',15);

})()

03_继承

(function(){

class Animal {

name: string;

age: number;

constructor(name:string,age:number) {

this.name = name;

this.age = age;

}

sayHel() {

return '叫!'

}

}

// 使dog类继承animal类

/*

animal 被称为父类,Dog被称为子类

使用继承后,子类拥有父类的属性和方法

通过继承可以将多个类中共有的代码写到一个父类中

这样只需要写一次即可让所有的子类都同时拥有父类的属性和方法

如果在子类中添加一个与父类中相同的方法,会覆盖调父类的方法,被称为方法的重写

*/ class Dog extends Animal{

sayHel() {

return ${this.name} 在叫!

}

}

// 定义猫的类

class cat extends Animal{

}

const dog = new Dog('小哈',12);

const Dat = new cat('sdi',15);

console.log(dog.sayHel())

console.log(dog)

})()

04_super

(function(){

class Animal{

name:string;

constructor(name:string) {

this.name = name;

}

sayHello() {

console.log('ijjj')

return 'hhhh'

}

}

class Dog extends Animal{

age: number;

constructor(name:string,age:number) {

// 如果在子类中写了构造函数,在子类构造函数中必须对父类构造器进行调用

super(name); // 调用父类的构造函数

this.age = age;

}

sayHell() {

// 在类的方法中super就表示当前类的父类

super.sayHello()

}

}

const dog = new Dog('小华',333);

})()

05_抽象类

(function(){

/* 以abstract 开头的类是抽象类

抽象类和其他类的区别不大,只是不能用来创建对象

抽象类就是专门用来被继承的类

抽象类中可以添加抽象方法 */

abstract class Animal

name:string;

constructor(name:string) {

this.name = name;

}

// sayHello() {

//    console.log('ijjj')

//    return 'hhhh'

// }

// 定义一个抽象方法

// 抽象方法使用abstract开头,没有方法体

// 抽象方法只能定义在抽象类中,子类必须对抽象方法进行重写

abstract sayHello(): void;

}

class Dog extends Animal{

age: number;

constructor(name:string,age:number) {

// 如果在子类中写了构造函数,在子类构造函数中必须对父类构造器进行调用

super(name); // 调用父类的构造函数

this.age = age;

}

sayHello() {

// 在类的方法中super就表示当前类的父类

// super.sayHello()

}

}

const dog = new Dog('小华',333);

})()

06_接口的定义

(function(){

/*

接口用来定义一个类结构,用来定义一个类中应该包含哪些属性和方法

同时接口也可以当成类型声明去使用

*/ interface myInterface{

name:String;

age:Number;

}

const obj: myInterface = {

name:'小李',

age:12

}

/*

接口可以在定义类的时候去限制类的结构

接口中的所有的属性都不能有实际的值

接口只定义对象的结构,而不考虑实际的值

在接口中所有的方法都是抽象的方法

*/ interface myInter {

name:String;

} /* 定义类时,可以始类去实现一个接口

实现接口就是使类满足接口的要求

*/

})()

07_属性的封装

(function(){

// 定义一个表示人的类

class Person { /*

Ts可以在属性前添加属性的修饰符

public 修饰的属性可以在任意位置访问(修改)默认值

private 私有属性,私有属性只能在类内部进行访问(修改)

-- 通过类中添加方法使得私有属性可以被外部访问

protected 受包含的属性,只能在当前类和当前类的子类中访问修改

*/ private name: string;

private age: number;

constructor(name:string,age:number) {

this.name = name;

this.age = age

} /* setter 方法用来设置属性

它们被称为属性的存取器

*/ // getName() {

//   return this.name;

// } // setName(seName: string) {

//   this.name = seName;

// }

// getAge() {

//   return this.age;

// } // setAge(setAge: number) {

//   if(setAge >= 0){

//     this.age = setAge;

//   }

// }

// TS中设置getter方式

get named() {

return this.name

} set named(setName: string) {

this.name = setName;

}

}

const pre = new Person('小李',18);

/* 现在属性是在对象中设置的,属性可以任意的被修改

属性可以任意被修改将会导致对象中的数据变得非常不安全

*/ // pre.name = '小华';

// pre.age = -20;

// console.log(pre.named('小明'));

// console.log(pre.named());

// console.log(pre.setAge(-312));

// console.log(pre.getAge());

class A {

protected name: string;

constructor(names: string) {

this.name = names;

}

}

class B extends A {

getName() {

return this.name;

}

} const b = new B('小华');

})()

08_泛型

/* any 类型直接跳过类型检测

*/ function fanxing(name: any): any {

return name;

} /* 泛型: 在定义函数或者类型时,遇到类型不明确就可以使用泛型

*/ function fanxin(name:T): T{

return name;

} // 可以直接调用具有泛型的函数

fanxin('小李') // 不指定泛型,Ts可以自动对类型进行检测

fanxin(188) // 指定泛型

function fanxi<T,K>(name:T,age: K): T{

return name

} fanxi('晓华',18);

fanxi<string,number>('徐爱',20)

interface Innerface{

length: number;

} // T extends Inter 表示泛型T必须时Inter实现类(子类)

function pig(a:T): number {

return a.length

} class Myclass {

name:T;

constructor(name:T) {

this.name = name;

}

} const mc = new Myclass('小张');