# 接口

Typescrip的核心原则之一就是对值所具有的结构进行类型检查。可以使用Interface定义对象的类型。接口是对象的属性和方法的抽象

接口可以视为一种约束

# 举个🌰

❗️ 定义为接口类型的对象,对象的属性必须与接口规定的一致(属性名/属性类型/属性数量)

  interface hairline {
    id: number,
    type: string, // 发际线类型
    hair: number, // 头发数量
    stats: string // 发际线状态
  }

  let ethan: hairline = {
    id: 0,
    type: 'M',
    hair: 100,
    stats: 'less-hair'
  }

# 只读属性

有些属性只能在刚创建时就确定它的值。可以使用readonly表示,接👆🌰

// id一般是唯一的,不可再修改的
  interface hairline {
    readonly id: number,
    type: string, // 发际线类型
    hair: number, // 头发数量
    stats: string // 发际线状态
  }

  // 不会报错
  let ethan: hairline = {
    id: 0,
    type: 'M',
    hair: 100,
    stats: 'less-hair'
  }
  // ethan.id = 1 // 报错: 无法分配到 "id" ,因为它是只读属性

# 可选属性

有时接口中的属性不全是必要的。可以使用?表示,接👆🌰

// 头发数量不一定能统计到,所以不是必须的,可以这样表示
  interface hairline {
    readonly id: number,
    type: string, // 发际线类型
    hair?: number, // 头发数量
    stats: string // 发际线状态
  }

  // 不会报错
  let ethan: hairline = {
    id: 0,
    type: 'M',
    stats: 'less-hair'
  }

# 函数类型

通过接口的方式作为函数类型,需要给接口定义一个调用签名。 其实就是给函数定义参数列表和返回值类型。 参数列表里的每个参数都需要名字和类型。

  interface ISrchHairline {
  // 定义一个调用签名
  //参数列表:返回值类型
  (source: object, key: string): string
  }

  const srchHairline: ISrchHairline = function(source: object, key: string): string {
  // return source[key]
  return (source as any)[key]
  }

  console.log(srchHairline(hairline, 'stats')) // less-hair

# 类类型

接口同样可以约束类的类型

# 类实现接口

  interface CountHair {
    count(num: number): number
  }

  class Nurse implements CountHair {
    count(num: number): number {
      console.log(`一根一根数头发,有${num}`)
      return num
    }
  }
  const nurse = new Nurse()
  nurse.count(10) // 一根一根数头发,有10根

# 多接口

类实现多个接口,接👆🌰

  interface Inject {
    injecting(): string
  }

  class Nurse implements CountHair,Inject  {
    count(num: number): number {
      console.log(`一根一根数头发,有${num}`)
      return num
    }
    injecting() {
      console.log('到点打针了')
      return '到点打针了'
    }
  }
  const nurse = new Nurse()
  nurse.count(10) // 一根一根数头发,有10根
  nurse.injecting() // 到点打针了

# 接口继承

接口与类一样可以相互继承,这样可以灵活的组合,拆分使用,用extends表示,接👆🌰

  interface NurseDuty extends CountHair, Inject { }
  class Nurse implements NurseDuty {
    count(num: number): number {
      console.log(`一根一根数头发,有${num}`)
      return num
    }
    injecting() {
      console.log('到点打针了')
      return '到点打针了'
    }
  }

  const nurse = new Nurse()
  nurse.count(10)
  nurse.injecting()

# 总结

类与接口间叫实现(implements),接口与接口间叫继承(extends)