前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >TypeScript学习第六篇 - 接口的定义

TypeScript学习第六篇 - 接口的定义

作者头像
越陌度阡
发布2020-11-26 14:44:58
5810
发布2020-11-26 14:44:58
举报

在面向对象的编程中,接口是一种规范的定义,它定义了行为和动作的规范,在程序设计里面,接口起到了一种限制和规范的作用,接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部状态数据,也不关心这些类里方法的实现细节,它只规定这批类里必须提供某些方法,提供方法的这些类就可以满足实际需要。

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

1. TypeScript中定义属性接口

代码语言:javascript
复制
// 约束传入的对象
interface FullName{
    firstName:string;
    secondName:string;
}

// 传参的类型为约束好的接口对象
function printName (name:FullName){
    console.log(name.firstName+'--'+name.secondName);
}

// 如果直接将参数传入,就只能传入约束过的字段值(firstName,secondName);
printName({
    firstName:'李',
    secondName:'四'
});

// 如果需要添加一些参数,需要将所有参数封装成一个对象传入。
var obj = {
    age:20,
    firstName:'张',
    secondName:'三'
}
printName(obj);

也可以对接口中的属性定义是否可选。

代码语言:javascript
复制
// 约束传入的对象
interface FullName{
    firstName:string;
    // 如果添加了问号,表示参数可传可不传
    secondName?:string;
}

// 传参的类型为约束好的接口对象
function printName (name:FullName){
    console.log(name);
}

// 由于secondName为可传可不传,所以只需要传入一个参数即可。
printName({
    firstName:'李四'
});

利用属性接口约束实现Ajax请求

代码语言:javascript
复制
// 定义Ajax请求必须要传的参数
interface Config{
    type:string;
    url:string;
    data?:string;
    dataType:string;
}

// 定义Ajax请求方法
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){
            if(config.dataType == 'json'){
               JSON.parse(xhr.responseText); 
            }else{
                console.log(xhr.responseText);
            }
        }
    }
};
// 调用封装方法
Ajax({
    type:'get',
    url:'http://www.baidu.com',
    dataType:'json'
})

2. TypeScript中定义函数类型接口。对方法传入的参数,以及返回值进行约束。

代码语言:javascript
复制
// 定义一个加密的函数类型接口
interface encrypt{
    // 定义参数类型与返回类型
    (key:string,value:string):string
}
// 参数类型与返回类型必须符合接口规范
var MD5:encrypt = function(key:string,value:string):string{
    // 模拟操作
    return key + value;
}
console.log(MD5('username','password'));

3. TypeScript中定义可索引类型接口。实现对数组和对象的约束。

代码语言:javascript
复制
// 对数组的约束
interface UserArr{
    // 约束索引为数字类型,数组中的元素为字符类型
    [index:number]:string
}

// var arr:UserArr = [123,456];
// 报错

var arr:UserArr=['Lucy','Augus'];
// OK

也可以实现对对象进行约束,用的比较少。

代码语言:javascript
复制
// 对象的约束
interface UserObj{
    [index:string]:string
}

// var arr:UserObj={age:20};
// 报错

var arr:UserObj={age:'20'};
// OK

4. TypeScript中定义类类型的接口。实现对类的约束。

代码语言:javascript
复制
// 定义类的属性与方法 
interface Animal{
    name:string;
    eat(str:string):void;
}
class Dog implements Animal{
    name:string;
    constructor(name:string){
        this.name = name;
    }
    // 可以不传参数,但是必须要定义方法
    eat(food:string){
        console.log(this.name +'吃'+food);
    }
}
var dog = new Dog('小黑');
dog.eat('肉');

5. TypeScript中接口的扩展。实现接口的继承。

代码语言:javascript
复制
// 定义父类接口
interface Animal{
    eat():void;
}

// 定义子类接口
interface Person extends Animal{
    work():void;
}

class Web implements Person{
    public name:string;
    constructor(name:string){
        this.name = name;
    }
    // 必须实现父类接口Animal定义的方法
    eat(){
        console.log(this.name+'吃肉');
    }
    // 必须实现子类接口Person定义的方法
    work(){
        console.log(this.name +'写代码')
    }
}

var boy = new Web('小李');
boy.eat();
// 小李吃肉

接口在实现接口约束的同时还可以实现类的继承。

代码语言:javascript
复制
// 定义父类接口
interface Animal{
    eat():void;
}
// 定义子类接口
interface Person extends Animal{
    work():void;
}
// 定义一个类
class Programmer{
    public 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)
    }
    // 实现基类Animal定义的方法
    eat(){
        console.log(this.name+'吃肉');
    }
    // 实现Person类定义的方法
    work(){
        console.log(this.name +'工作');
    }
}

var boy = new Web('小李');

boy.eat();
// 小李吃肉

boy.coding('写前端代码');
// 小李写前端代码
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/01/05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档