类
typescript 的类中添加了许多面向对象语言的特性
类的定义
1 2 3 4 5 6 7
| class Dog { constructor(name: string) { this.name = name } name: string run() {} }
|
类的继承
1 2 3 4 5 6 7 8 9 10 11
| class Husky extends Dog { constructor(name: string, color: string) { super(name) this.color = color } color: string }
|
类的公有,私有以及受保护成员
类中的成员默认是共有 public , 也可以使用私有 private, 私有成员只能在类的本身调用,不能被子类以及实例调用
protected受保护成员只能在 类或者子类中访问,不能在实例中访问
1 2 3 4 5 6 7 8 9
| class Dog { private constructor(name: string) { this.name = name } readonly age: number = 4 private say() {} protected pro() {} }
|
类的静态成员
静态成员只能通过类名调用可以被继承, 不能通过子类调用
1 2 3 4 5 6
| class Dog { constructor(name: string) { this.name = name } static food: string = 'milk' }
|
抽象类
抽象类只能被继承,不能被实例化。
在抽象类中可以有具体的方法实现,这样方便子类调用
也可以没有具体的实现,这就构成一个抽象方法,在子类中必须实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| abstract class Animal { eat() { console.log('eat'); } abstract sleep(): void; }
class Dog extends Animal{ constructor(name: string) { super() this.name = name } name: string run() { } sleep() { console.log('dog sleep'); } }
|
多态
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| abstract class Animal { eat() { console.log('eat'); } abstract sleep(): void; }
class Dog extends Animal{ constructor(name: string) { super() this.name = name } name: string run() { } sleep() { console.log('dog sleep'); } }
class Cat extends Animal{ sleep() { console.log('cat sleep'); } }
let cat = new Cat() let dog = new Dog('wangwangwang') let animals: Animal[] = [cat, dog] animals.forEach(i => { i.sleep() })
|
类的链式调用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| class WorkFlow { step1() { return this } step2() { return this } } class MyFLow extends WorkFlow { next() { return this } }
new MyFLow().next().step1().next()
|
类实现接口
接口可以规范类的成员,类实现接口时,必须实现接口中的所有成员
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| interface Human { name: string eat() : void } class MySelf implements Human{ constructor(name: string, age: number) { this.name = name this.age = age } age: number; name: string; eat() { console.log('i am eatting'); } }
|
接口继承接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| interface Human { name: string eat() : void }
interface Children extends Human{ run(): void; }
interface Boy extends Human, Children{ } class Aboy implements Boy{ constructor(name: string) { this.name = name } name: string eat() { console.log('aboy eatting'); } run() { console.log('aboy running'); } }
|
接口继承类
1 2 3 4 5 6 7
| class Animal { eat() { console.log('eatting'); } } interface Dog extends Animal{}
|
类和接口之前的关系
接口和接口之间可以继承,以实现接口的复用
类与类之间可以继承,以实现属性和方法的复用
接口可以通过类来实现,但是接口只能约束类的公有成员
接口也可以抽离出类的成员,抽离的时候会包括共有,私有和受保护成员
泛型
泛型可以保证 函数可以接受任意参数,且返回值类型与参数类型一致
泛型函数的定义
1 2 3 4 5 6
| function log<T>(value: T): T { console.log(value); return value } log<string[]>(['a','b']) log(['a','b'])
|
泛型接口的定义
1 2 3 4 5 6 7 8 9 10
| function log<T>(value: T): T { console.log(value); return value }
interface Log<T = string>{ (value: T) : T } let myLog: Log = log myLog('1')
|
泛型类的定义
1 2 3 4 5 6 7 8
| class Log<T> { show(value: T) { console.log(value); return value } } let log1 = new Log<string>() log1.show('hahah')
|