实现接口

  • 明确的强制一个类去符合某种契约

    1. interface Clockinterface {
    2. currentTime: Date
    3. setTime(d: Date): void
    4. // new (hour: number, minute: number) constructor存在于类的静态部分,所以不在检查的范围内
    5. }
    6. class Clock implements Clockinterface {
    7. currentTime: Date
    8. setTime(d: Date) {
    9. this.currentTime = d
    10. }
    11. constructor(h: number, m: number) {
    12. this.currentTime = new Date()
    13. }
    14. }

    静态部分和实力部分的区别

    1. interface ClockConstructor {
    2. new(hour: number, minute: number): ClockInterface;
    3. }
    4. interface ClockInterface {
    5. tick(): void
    6. }
    7. function createClock(ctor: ClockConstructor, hour: number, minute: number): ClockInterface {
    8. return new ctor(hour, minute);
    9. }
    10. class DigitalClock implements ClockInterface {
    11. constructor(h: number, m: number) { }
    12. tick() {
    13. console.log("beep beep");
    14. }
    15. }
    16. class AnalogClock implements ClockInterface {
    17. constructor(h: number, m: number) { }
    18. tick() {
    19. console.log("tick tock");
    20. }
    21. }
    22. let digital = createClock(DigitalClock, 12, 17);
    23. let analog = createClock(AnalogClock, 7, 32);

    接口继承

  • 接口也可以相互继承。

  • 这让我们能够从一个接口里复制成员到另一个接口里,可以更灵活地将接口分割到可重用的模块里。
  • 也可以继承多个接口

    1. interface Shape {
    2. color: string
    3. }
    4. interface Square extends Shape {
    5. sideLength: number
    6. }
    7. interface PenStroke {
    8. penWidth: number
    9. }
    10. interface M extends Shape, PenStroke {
    11. myNum: number
    12. }
    13. let square = <Square>{}
    14. square.color = 'red'
    15. square.sideLength = 10
    16. let myObj = <M>{}
    17. myObj.myNum = 2
    18. myObj.color = 'str'

    混合类型

  • 一个对象可以同时具有上面提到的多种类型

    1. interface Counter {
    2. (start: number): string
    3. interval: number
    4. reset(): void
    5. }
    6. function getCounter(): Counter {
    7. let counter = <Counter>function (start: number) { }
    8. counter.interval = 2
    9. counter.reset = function () { }
    10. return counter
    11. }
    12. let c = getCounter()
    13. c(10)
    14. c.reset()
    15. c.interval = 4

    接口继承

    1. class Control {
    2. private state: any
    3. }
    4. interface SelectableControl extends Control {
    5. select(): void
    6. }
    7. class Button extends Control implements SelectableControl {
    8. select() { }
    9. }
    10. class TextBox extends Control {
    11. select() { }
    12. }
    13. // Image缺少 state属性
    14. // class Image implements SelectableControl{
    15. // select(){}
    16. // }