【05】基础知识:typescript中的接口

一、接口的作用

在面向对象编程中,接口是一种规范的定义,它定义了行为和动作的规范;在程序设计里面,接口起到一种限制和规范的作用。

接口定义了某一批类所需要遵守的规范,接口并不关心这些类的内部状态数据,也不关心这些类里方法的实现细节,它只规定这批类里必须提供某些方法,提供这些方法的类就可以满足实际需要。

typescript 中的接口类似于 java,同时还增加了更灵活的接口类型,包括属性、函数、可索引和类等。

二、属性类型接口

1、了解,函数参数类型约束

typescript 中 函数的参数类型约束,只能对单个函数生效

// ts 中定义方法传入参数,约束类型必须为 string
function print(label: string): void {
    
    
  console.log(label)
}
print('hahah') // hahah

// ts 中定义方法传入参数,对 json 进行约束
function printObj(labelInfo: {
     
      label: string }): void {
    
    
  console.log(labelInfo.label)
}
printObj({
    
     label: 'hahah' }) // hahah

2、属性类型接口对方法入参批量约束

属性接口用来对 json 进行约束,对批量方法传入参数进行约束。 通过 interface 关键字来定义接口。

// 定义属性接口,对传入对象进行约束
interface FullName {
    
    
  firstName: string; // 注意,以 ; 结束,可省略 
  lastName: string
}

// 定义方法 getName
function getName(name: FullName): void {
    
    
  console.log(`${
      
      name.firstName}${
      
      name.lastName}`)
}
// 定义方法 returnName
function returnName(name: FullName): string {
    
    
  return `${
      
      name.firstName}${
      
      name.lastName}`
}

// 传入参数必须包含 firstName、lastName;参数的顺序可以不一样
getName({
    
     firstName: '林', lastName: '一'})
returnName({
    
     firstName: '佟', lastName: '年'})

3、属性类型接口的可选属性

typescript 中 通过【 属性名称?: 数据类型 】形式来定义可选属性,代表该属性在当前 json 对象可以不传。

// 接口:可选属性
interface FullName {
    
    
  firstName?: string // 可选属性
  lastName: string
}

// 定义方法 getName
function getName(name: FullName): void {
    
    
  console.log(`${
      
      name.firstName}${
      
      name.lastName}`)
}

getName({
    
     lastName: '一'}) // undefined一

4、属性类型接口案例

jquery ajax请求 封装,仅为示例

interface Config {
    
    
  type: string // 请求方式
  url: string // 请求地址
  data?: string // 请求参数
  dataType: string // 参数类型
}

function ajax(config: Config) {
    
    
  let xhr = new XMLHttpRequest()
  xhr.open(config.type, config.url, true)
  xhr.send(config.data)
  xhr.onreadystatechange = function() {
    
    
    if (xhr.readyState == 4 && xhr.status == 200) {
    
    
      if (config.dataType =='json') {
    
    
        console.log(JSON.parse(xhr.responseText))
      }
    }
  }
}

ajax({
    
    
  type: 'get',
  url: 'http://a.itying.com/api/productlist', // api
  data:'name=zhangsan',
  dataType: 'json'
})

三、函数类型接口

对方法传入的参数,以及返回值进行约束

// 定义加密的函数类型接口
interface encrypt {
    
    
  (key: string, value: string): string
}

const md5: encrypt = function(key:string, value: string): string {
    
    
  // 模拟操作,加密算法
  return `${
      
      key}+${
      
      value}`
}

const sha1: encrypt = function(key:string, value: string): string {
    
    
  // 模拟操作,加密算法
  return `${
      
      key}-${
      
      value}`
}

console.log(md5('md5', '加密字符串')) // md5+加密字符串
console.log(sha1('sha1', '加密字符串')) // sha1-加密字符串

四、可索引类型接口

对数组、对象进行约束,不常用

1、约束数组

// ts中定义数组
const arr: number[] = [1, 2]
const arr2: Array<string> = ['1', '2']

// 定义可索引类型接口
interface UseArr {
    
    
  // 索引值为number,value为string
  [index: number]: string
}

const arr3: UseArr = ['1', '2']

2、约束对象

interface UseObj {
    
    
  // 索引值为string,value为string
  [index: string]: string
}

const obj: UseObj = {
    
    
  name: 'lily',
  sex: '女'
}

五、类类型接口

类类型接口用来对类进行约束,和抽象类相似。通过关键字 interface 定义接口,在类中通过关键字 implements 来实现接口。

// 定义 类类型接口(标准)
interface Animal {
    
    
  name: string
  eat(str: string): void
}

// 实现接口
class Dog implements Animal {
    
    
  public name: string
  constructor(name: string) {
    
    
    this.name = name
  }

  // 类中必须要有 eat 方法,没有 ts 编译保存;参数可以没有
  eat(str: string): void {
    
    
    console.log(`${
      
      this.name}${
      
      str}`)
  }
}

// 实例化 Dog 类
const dog = new Dog('小黑')
dog.eat('粮食') // 小黑吃粮食

六、接口扩展

接口可以继承接口,接口之前通过关键字 extends 进行继承。

interface Animal {
    
    
  eat(): void
}

// Person接口 继承 Animal接口
interface Person extends Animal {
    
    
  work(): void
}

// People类 使用 Person接口
class People implements Person {
    
    
  public name: string
  constructor(name: string) {
    
    
    this.name = name
  }

  eat(): void {
    
    
    console.log(this.name, 'People类必须有eat方法')
  }

  work(): void {
    
    
    console.log(this.name, 'People类必须有work方法')
  }
}

const people = new People('某个人')
people.eat() // 某个人 People类必须有eat方法
people.work() // 某个人 People类必须有work方法

复杂应用示例,类继承父类并实现接口

interface Animal {
    
    
  eat(): void
}

interface Person extends Animal {
    
    
  work(): void
}

class Programmer {
    
    
  public name: string
  constructor(name: string) {
    
    
    this.name = name
  }
  coding(code: string): void {
    
    
    console.log(this.name + code)
  }
}

// People类 继承Programmer类  使用Person接口
class People extends Programmer implements Person {
    
    
  constructor(name: string) {
    
    
    super(name)
  }

  eat(): void {
    
    
    console.log(this.name, 'People类必须有eat方法')
  }

  work(): void {
    
    
    console.log(this.name, 'People类必须有work方法')
  }
}

const people = new People('某个人')
people.eat() // 某个人 People类必须有eat方法
people.work() // 某个人 People类必须有work方法
people.coding('在工作') // 某个人在工作

猜你喜欢

转载自blog.csdn.net/weixin_45559449/article/details/132340721