typescript基础知识(四)接口

在我的理解中,接口是用于对一系列方法/属性定义一些标准化的内容,在typescript中体现为对类型的标准化,使用interface关键字来定义一个接口

属性接口


属性接口针对于对象的属性标准化

interface Information{ // 接口
    name:string;
    age:number;
}

function person(info:Information):void{ 
// 传入的对象必须包含类型为string的属性name和类型为number的属性age
    console.log(`I am ${info.name},and I am ${info.age} years old now`);
}

person({name:'小明',age:18});

要注意的是,如果和上面一样在传入参数的位置写出变量,那么对象只能包含接口里面的属性,而如果事先定义好一个对象,那么可以包含接口里面的属性外的其他属性,因此最好事先定义一个对象再作为参数传入

person({name:'小明',age:18}); // 正确

person({id:2,name:'小明',age:18}); // 错误

let obj={
    id:2,
    name:'小明',
    age:18
}
person(obj); // 正确

可选属性接口

如果有些参数可传可不传,可以通过在属性名和类型之间加入“?”来使其变为可选属性

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

function person(info:information){
    if(!info.age){
        console.log(`I am ${info.name}`);
    }else{
        console.log(`I am ${info.name},and I am ${info.age} years old now`)
    }
}

let p1={
    name:'小明'
}

let p2={
    name:'小红',
    age:18
}

person(p1); // I am 小明

person(p2); // I am 小红,and I am 18 years old now

函数接口


函数接口是用于标准化函数的参数个数,参数类型以及返回值的类型

interface fn{
    (first:string,second:number):string;
}

var fn:fn=function(f:string,s:number):string{
    return `f:${f}----s:${s}`;
}
console.log(fn('1',2)); // f:1----s:2

接口中括号内是参数的个数和类型,按顺序写出参数的类型,括号后面即为函数返回值的类型

可索引接口


可索引接口是用于标准化有索引的类型,如数组和对象,但不是很实用

interface Arr{
    [index:number]:string; // 下标为number,成员为string,也就是数组了
}

let arr:Arr=['123','123'];

interface Obj{
    [index:string]:string; // 下标为string,也就是对象了
}

let obj:Obj={name:'小明',age:'18'};

类接口


类接口用于标准化类,类使用类接口和子类继承抽象类很类似,都必须有其内定义的所有属性方法,且类型需要相同,类通过implements关键字来使用接口

interface Person{
    name:string;
    work():string;
}

class Student implements Person{
    name:string;
    constructor(name:string){
        this.name=name;
    }
    work(){
        return '读书';
    }
}

接口间的继承


接口之间也是能使用继承的,被子接口约束的内容也会被其继承的父接口约束,接口间的继承通过extends关键字来实现

interface Person{
    name:string;
    introduce():string;
}

interface Student extends Person{
    work():string;
}

class Monitor implements Student{ 
// 通过使用Student接口,同时受到了Person接口的约束
    name:string;
    constructor(name:string){
        this.name=name;
    }
    introduce(){
        return `I am ${this.name}`;
    }
    work(){
        return 'study';
    }
}

泛型接口


在说泛型接口前先说一下泛型

泛型的使用使得参数可以在使用时才确定参数的类型,对于不确定类型的使用有很大的应用性

泛型函数

泛型通过将<>来实现,<>里面的内容即为泛型的具体数据类型,在声明时可随意写入字母

function fn<T>(val:T):T{
    return val;
}

fn<number>(1);

泛型类

class Person<T>{
    out(val:T):T{
        return val; 
    }
}

let p=new Person<number>();
p.out(1);

接口

泛型接口即在标准化内容时使用接口来进行标准化,使得在使用时可以使用不同的数据类型

interface Gen{
    <T>(value:T):T;
}

var gen:Gen=function<T>(val:T):T{
    return val;
}

gen<number>(2);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值