美文网首页
typescript 接口

typescript 接口

作者: 北冥有咸鱼_ | 来源:发表于2020-05-12 18:42 被阅读0次

在 TypeScript 中,我们使用接口(Interfaces)来定义对象的类型。接口起到一个限制和规范的作用
type(类型别名)跟interface差不多

什么是接口

现实中的接口.png

接口差不多就这样,你大小宽度什么的得对应起来

在面向对象语言中,接口(Interfaces)是一个很重要的概念,它是对行为的抽象,而具体如何行动需要由类(classes)去实现(implement)。

interface Person {
    name: string;
    age: number;
}

let tom: Person = {
    name: 'Tom',
    age: 25
};

上面的例子中,我们定义了一个接口 Person,接着定义了一个变量 tom,它的类型是 Person。这样,我们就约束了 tom 的形状必须和接口 Person 一致。

定义的变量比接口少了一些属性是不允许的:

interface Person {
    name: string;
    age: number;
}

let tom: Person = {
    name: 'Tom'
};

// index.ts(6,5): error TS2322: Type '{ name: string; }' is not assignable to type 'Person'.
//   Property 'age' is missing in type '{ name: string; }'.

多一些属性也是不允许的:

interface Person {
    name: string;
    age: number;
}

let tom: Person = {
    name: 'Tom',
    age: 25,
    gender: 'male'
};

// index.ts(9,5): error TS2322: Type '{ name: string; age: number; gender: string; }' is not assignable to type 'Person'.
//   Object literal may only specify known properties, and 'gender' does not exist in type 'Person'.

可见,赋值的时候,变量的形状必须和接口的形状保持一致。

可选属性

有时我们希望不要完全匹配一个形状,那么可以用可选属性:

interface Person {
    name: string;
    age?: number;
}

let tom: Person = {
    name: 'Tom'
};
or
let tom: Person = {
    name: 'Tom',
    age: 25
}; 
//都可

这时仍然不允许添加未定义的属性:

interface Person {
    name: string;
    age?: number;
}

let tom: Person = {
    name: 'Tom',
    age: 25,
    gender: 'male'
};

// examples/playground/index.ts(9,5): error TS2322: Type '{ name: string; age: number; gender: string; }' is not assignable to type 'Person'.
//   Object literal may only specify known properties, and 'gender' does not exist in type 'Person'.

任意属性

有时候我们希望一个接口允许有任意的属性,可以使用如下方式:

interface Person {
    name: string;
    age?: number;
    [propName: string]: any;
}

let tom: Person = {
    name: 'Tom',
    gender: 'male'
};

使用 [propName: string] 定义了任意属性取 string 类型的值。

🌰

interface FullName{
  firstName:string; //⚠️:分号结束
  secondName:string; 
}
function printName(name:FullName){
  //必须传入对象 firstName secondName
  console.log(name.firstName+'--'name.secondName)
}
printName({
  firstName:'赵',
  second:'四',
  age:20 //这个会报错,因为接口没有定义这个
})

但是 如果这样写:
let obj = {
   firstName:'赵',
   second:'四',
   age:20
}
printName(obj) //不报错
//至于为啥,我也不造

🌰 ts封装ajax

interface Config{
  type:string;
  url:string;
  data?:string;
  dataType:string;
}
function ajax(config:Config){
  let xhr = new HMLHttpRequest();
  xhr.open(config.type,config.url,true);
  xhr.send(config.data);
  xhr.onReadyStatusChange = function(){
     if(xhr.readyState === 4 && xhr.status === 200) {
      console.log('success')
      if(config.dataType =='JSON'){
        return JSON.parse(xhr.responeseText)
      } else{
        return xhr.responeseText
      }
    }
  }
}
ajax({
  type:'get',
  url:'http://www.xxx.com',
  dataType:'json'
})

函数类型接口

对方法传入的参数已经返回值进行约束
实现一个加密的函数类型接口

interface encrypt{
  (key:string,value:string):string;
}
//参数是key和value,必填。返回值是string

var md5:encrypt = function(key:string,value:string):string{
  return key+value;
}
md5('name','zhangsan') //namezhangsan

var sha1:encrypt = function(key:string,value:string):string{
  return value+key
}
sha1('name','zhangsan') //zhangsanname
可索引接口

对数组、对象的约束(不常用)

interface UserArr{
  [index:number]:string
}

类类型接口

父定义一个标准,子实现。下面的例子,如果缺少name或者eat 就会报错。(与抽象类抽象方法类似)

interface Animal{
  name:string;
  eat(str:string):void;
}
class Dog implements Animal{
  constructor(name:string){
    this.name = name
  }
  eat(){
    console.log(`${this.name}吃狗粮`)
  }
}
let d = new Dog('小黑') 
d.eat(); //小黑吃狗粮
class Cat implements Animal{
  name:string;
  constructor(name:string){
    this.name = name
  }
  eat(food:string):void{
    console.log(`${this.name}吃${food}`)
  }
}
let c = new Cat('小猫');
c.eat('鱼') //小猫吃鱼

接口扩展(继承)

interface Animal{
  eat():void
}
interface Person extends Animal{
  work():void;
}
class Web implements Person{
  name:string;
  constructor(name:string){
    this.name = name
  }
  eat(){
    console.log(this.name+'喜欢吃棉条')
  };
  work(){
    console.log(this.name+'敲代码')
  }
}
let w = new Web('李四')
w.work(); //李四敲代码
interface Animal{
  eat():void
}
interface Person extends Animal{
  work():void;
}
class Programmer{
  name:string;
  constructor(name:string){
    this.name = name
  }
  coding(code:string){
    console.log(this.name+code)
  }
}
class Web extends Programmer implements Person{
  constructor(name:string){
    super(name)
  }
  eat(){
    console.log(this.name+'喜欢吃棉条')
  };
  work(){
    console.log(this.name+'敲代码')
  }
}
let w = new Web('李四')
w.work(); //李四敲代码
w.coding('写ts') //李四写ts

相关文章

  • TypeScript 中的接口(interface)

    TypeScript 中的接口可分为: 之前的文章 TypeScript 基础类型和接口(interface)里面...

  • 学习TypeScript 接口

    TypeScript 接口定义 interface interface_name {} 实例 联合类型和接口 接口...

  • TypeScript学习笔记之四接口(Inferfaces)

    一、使用环境 Mac 电脑 WebStorm TypeScript3.x版本 二、接口 在 TypeScript ...

  • TypeScript - 接口

    TypeScript - 接口( Interface) [TOC] 学习目标 理解接口的概念 学会通过接口标注复杂...

  • TypeScript 接口

    TypeScript接口 接口只读属性 使用关键字readonly定义只读的接口属性 出现错误,如下 创建不可修改...

  • TypeScript接口

    属性类型接口 函数类型接口 定义了函数的参数。包括入参和出参。 可索引类型接口 类类型接口

  • typescript 接口

    日期:2019 年 8 月 29 日 typescript 接口 介绍 TypeScript的核心原则之一是对值所...

  • TypeScript接口

    接口定义 类型检查器不会检查属性的顺序,只要相应的属性存在并且类型匹配即可。 可选属性 定义可选属性只需要在属性后...

  • TypeScript——接口

    TypeScript的核心原则之一是对值所具有的结构进行类型检查。 它有时被称做“鸭式辨型法”或“结构性子类型化”...

  • TypeScript -- 接口

    接口可以用来约束对象,函数,以及类的结构和类型,这是一种代码协作的契约 1,对象类型接口interfaceLi...

网友评论

      本文标题:typescript 接口

      本文链接:https://www.haomeiwen.com/subject/hynbnhtx.html