04_TypeScript中的接口

180 阅读4分钟

属性接口

首先明确一下什么是接口

接口:行为和动作的规范,对批量方法进行约束,定义接口的时候使用interface。

接口可以重复使用

function printLabel(name:string):any {
    console.log('printLabel');
}
printLabel('aaa');

function printLabel1(labelInfo:{label:string}):any {
    console.log('printLabel1');
}
printLabel1({label:"lisi"});//正确写法
// printLabel1({name:'wangwu'});//错误写法

//对批量方法传入参数进行约束
// 接口:行为和动作的规范,对批量方法进行约束,使用interface
//这里定义接口Fullname,规定里面必须有firstName和secondName两个参数
interface Fullname{
    firstName:string;
    secondName:string;
}
//1.定义一个函数printName,里面的参数类型是接口Fullname里面的参数类型
function printName(name:Fullname):any{
    //必须传入对象 firstname和secondname
    console.log(name.firstName + name.secondName);
}
//这种方法只能包含interface里面定义的两内容 调用函数printName,传递参数
printName({
    firstName:'jiakang',
    secondName:'wu'
})


//2.再次定义一个printInfo函数,里面的参数类型是接口Fullname里面的参数类型
function printInfo(info:Fullname):any{
    //必须传入对象 firstname和secondname
    console.log(info.firstName + info.secondName);
}
//这种声明一个对象,可以包含age,age并没有在interface里面进行声明
const obj1 = {
    firstName:'san',
    secondName:'zhang',
    age:12
}
printInfo(obj1)

属性接口可传可不传参数

使用 ?号来表示这个参数是不是必须的,这个函数里面传递参数的方式一致,都是通过?来表示该参数是否是必须的

interface Fullname1{
    firstName:string;
    secondName?:string;
}
function getName(name:Fullname1):any{
    //必须传入对象 firstname和secondname
    console.log(name);
}
//这种方法只能包含interface里面定义的内容
getName({
    firstName:'jiakang',
    secondName:'wu1'
})

案例

/*
$ajax({
    type:'get',
    url:"test.json",
    data:{username:$('#username').val(),content:$('#content').val()
})
 */

interface Config {
    type:string,
    url:string;
    data:string;
    dataType:string;

}
function ajax(config:Config) {
    var xhr= new XMLHttpRequest();
    xhr.open(config.type,config.url,true);
    xhr.send(config.data)
    xhr.onreadystatechange=function () {
        if (xhr.readyState==4&&xhr.status==200){
            console.log('成功');
        }
    }
}
ajax({
    type:'get',
    data:'name=zhangsan',
    url:'http:www.baidu.com',
    dataType:'json'
})

加密型接口

interface encrypt{
    (key:string,value:string):string;
}
var md5:encrypt=function (key: string, value: string):
    string {
    return key+value
}
console.log(md5('name', 'zhangsan'));

var sha1:encrypt=function (key: string, value: string):
    string {
    return key+value
}
console.log(sha1('name', 'lisi'));

继承

  • 接口继承接口使用的是extends。也就是说无论是类继承类还是接口继承接口都是用的是extends

  • 而类和类之间的继承使用的是extends和super来完成的;

  • 一个类可以同时继承类和接口,当然接口和类都是可以继承多个的

  • 接口只要继承了,接口里面的方法必须要有,否则报错

一个类继承一个接口

定义一个Doggs类,继承Animal的接口

interface Animal { //这里定义了一个Animal的接口
    name:string;
    eat(str:string):void;
}
class Doggs implements Animal { //定义一个Doggs类,继承Animal的接口
    name:string;
    constructor(name:string){
        this.name=name;
    }
    eat(){ //这里可以没有参数,因为上面已经传了
        console.log(this.name + '吃粮食');
    }
}
var dog= new Doggs('小黑');
dog.eat();

一个接口继承另一个接口extends,同时使用类继承接口-implements

interface Animal { //Animal接口有eat方法
    eat():any;
}
//接口之间的继承使用的是extends
interface People extends Animal { // People接口继承Animal接口,继承了Animal里面的属性和方法,拥有了eat方法和自己本身的方法work方法
    work():any;
}
class Wab implements People { //定义Wab类继承People接口,拥有了eat和work方法
    public name:string;
    constructor(name:string){
        this.name=name;
    }
    eat(){
        console.log(this.name + '喜欢吃馒头');
    }
    work(){
        console.log(this.name + '喜欢工作');
    }
}
var wab = new Wab('小丽');
wab.eat();
wab.work();

一个类同时继承另外一个类和多个接口

interface Animal2 { //Animal接口有eat方法
    eat():any;
}
interface People2 extends Animal { // People2接口继承Animal2接口,继承了Animal里面的属性和方法,拥有了eat方法和自己本身的方法work方法
    work():any;
}

interface People3 extends Animal { // People3接口继承Animal2接口,继承了Animal里面的属性和方法,拥有了eat方法和自己本身的方法sleep方法
    sleeping():any;
}
class Man2 { //定义了Man2类
    name:string;
    constructor(name:string){
        this.name = name;
    }
    conding(code:string){
        console.log(this.name + code);
    }
}
//继承Man的类,同时继承接口People2和People3
class Wab2 extends Man2 implements People2,People3 {
    public name:string;
    constructor(name:string){
        super(name)
    }
    eat(){
        console.log(this.name + '喜欢吃馒头');
    }
    work(){
        console.log(this.name + '喜欢工作');
    }
  	sleeping(){
        console.log(this.name + '喜欢睡觉');
    }
}
var wab2 = new Wab2('小丽');
wab2.eat();
wab2.work();
wab2.sleeping();
wab2.conding('写ts代码');

一个类同时继承多个类和多个接口

interface Animal2 { //Animal接口有eat方法
    eat():any;
}
interface People2 extends Animal { // People2接口继承Animal2接口,继承了Animal里面的属性和方法,拥有了eat方法和自己本身的方法work方法
    work():any;
}

interface People3 extends Animal { // People3接口继承Animal2接口,继承了Animal里面的属性和方法,拥有了eat方法和自己本身的方法sleep方法
    sleeping():any;
}
class Man2 { //定义了Man2类
    name:string;
    constructor(name:string){
        this.name = name;
    }
    conding(code:string){
        console.log(this.name + code);
    }
}
class Man3 { //定义了Man3类
    name:string;
    constructor(name:string){
        this.name = name;
    }
    conding(code:string){
        console.log(this.name + code);
    }
}
//继承Man2和Man3的类,同时继承接口People2和People3
class Wab2 extends Man2,Man3 implements People2,People3 {
    public name:string;
    constructor(name:string){
        super(name)
    }
    eat(){
        console.log(this.name + '喜欢吃馒头');
    }
    work(){
        console.log(this.name + '喜欢工作');
    }
  	sleeping(){
        console.log(this.name + '喜欢睡觉');
    }
}
var wab2 = new Wab2('小丽');
wab2.eat();
wab2.work();
wab2.sleeping();
wab2.conding('写ts代码');