TypeScript--类(Class)与接口(interface)

接口定义对象的类型

一种定义复杂类型的格式, 好比咱们用对象格式存储一篇文章, 那么就能够用接口定义文章的类型:vue

interface Article {
    title: stirng;
    count: number;
    content:string;
    fromSite: string;
}

const article: Article = {
    title: '为vue3学点typescript(2), 类型',
    count: 9999,
    content: 'xxx...',
    fromSite: 'baidu.com'
}

复制代码

在这种状况下,当咱们给article赋值的时候, 若是任何一个字段没有被赋值或者字段对应的数据类型不对, ts都会提示错误, 这样就保证了咱们写代码不会出现上述的小错误.typescript

非必填(?)

仍是上面的例子, fromSite的意思是文章来自那个网站,若是文章都是原创的, 该字段就不会有值, 可是若是咱们不传又会提示错误, 怎么办? 这时候就须要标记fromSite字段为非必填, 用"?"标记:bash

interface Article {
    title: stirng;
    count: number;
    content:string;
    fromSite?: string; // 非必填
}

// 不会报错
const article: Article = {
    title: '为vue3学点typescript(2), 类型',
    count: 9999,
    content: 'xxx...',
}

复制代码

用接口定义函数

接口不只能够定义对象, 还能够定义函数:函数

// 声明接口
interface Core {
    (n:number, s:string):[number,string]
}

// 声明函数遵循接口定义
const core:Core = (a,b)=>{
    return [a,b];
}

复制代码

类实现接口

实现(implements)是面向对象中的一个重要概念。通常来说,一个类只能继承自另外一个类,有时候不一样类之间能够有一些共有的特性,这时候就能够把特性提取成接口(interfaces),用 implements 关键字来实现。这个特性大大提升了面向对象的灵活性。网站

先简单看下如何给类定义接口:ui

// 定义
interface Animate {
    head:number;
    body:number;
    foot:number;
    eat(food:string):void;
    say(word:string):string;
}

// implements
class Dog implements Animate{
    head=1;
    body=1;
    foot=1;
    eat(food:string){
        console.log(food);
    }
    say(word:string){
        return word;
    }
}
复制代码

一个类能够实现多个接口:spa

interface Alarm {
    alert();
}

interface Light {
    lightOn();
    lightOff();
}

class Car implements Alarm, Light {
    alert() {
        console.log('Car alert');
    }
    lightOn() {
        console.log('Car light on');
    }
    lightOff() {
        console.log('Car light off');
    }
}
复制代码

上例中,Car 实现了 AlarmLight 接口,既能报警,也能开关车灯。3d

接口继承接口

接口与接口之间能够是继承关系:code

interface Alarm {
	alert();
}

interface LightableAlarm extends Alarm {    
	lightOn();    
	lightOff();
}
复制代码

上例中,咱们使用 extends 使 LightableAlarm 继承 Alarm对象

接口继承类

接口也能够继承类:

class Point {
    x: number;
    y: number;
}

interface Point3d extends Point {
    z: number;
}

let point3d: Point3d = {x: 1, y: 2, z: 3};
复制代码

混合类型

能够使用接口的方式来定义一个函数须要符合的形状:

interface SearchFunc {
    (source: string, subString: string): boolean;
}

let mySearch: SearchFunc;
mySearch = function(source: string, subString: string) {
    return source.search(subString) !== -1;
}
复制代码

有时候,一个函数还能够有本身的属性和方法:

interface Counter {
    (start: number): string;
    interval: number;
    reset(): void;
}

function getCounter(): Counter {
    let counter = <Counter>function (start: number) { };
    counter.interval = 123;
    counter.reset = function () { };
    return counter;
}

let c = getCounter();
c(10);
c.reset();
c.interval = 5.0;
复制代码
相关文章
相关标签/搜索