博客 / 詳情

返回

TypeScript系列:【4】接口

接口就是定義一個類型,比如一個json數據或一個函數等,描述其具體的結構就可以使用接口來規範。

基礎説明

先來看個例子:

interface MyDataType {
    name: string,
    age: number
}

我們定義了一個json的數據格式,可以且只可以包含值是字符串的name屬性和值是數字的age屬性,下面是一個正確的例子:

let myData: MyDataType={
    name:"小明",
    age:19
};

可選屬性

假如我們認為age是可選的,也就是 {name:"小明"} 也是正確的值,那麼就可以這樣調整:

interface MyDataType {
    name: string,
    age?: number
}

只讀屬性

如果你希望name不被後續修改,也就是隻讀的,可以這樣修改:

interface MyDataType {
    readonly name: string,
    age: number
}

如果一個數組類型 Array 希望標記是隻讀的,可以使用新類型 ReadonlyArray 進行代替。

函數類型

比如我們想定義一個函數,傳遞一個字符串和一個數字,返回一個字符串:

interface DoitFunc {
    (name: string, age: number): string
}

下面是一個正確的例子:

let doit: DoitFunc = function (name: string, age: number): string {
    return "姓名:" + name + ",年齡:" + age;
}

可索引的類型

基礎使用

也就是那些可以通過 索引 得到值的類型,典型的就是json和數組。

interface MyDataType {
    [index: number]: string
}
温馨提示:比如這裏的index可以是任意合法的標誌符,具體是什麼並沒有什麼意義。

比如下面的值就是合法的:

let myData: MyDataType = ["小明", "小強"];

let myData: MyDataType = {};
myData[0] = "小明";
myData[1] = "小強";

多類型屬性

索引除了是數字外,還可以是字符串,定義和上面是類似的。此外,也可以同時定義索引可以是字符串或數字:

interface MyDataType {
    [key1: number]: string;
    [key2: string]: string;
}

下面是一個正確的例子:

let myData: MyDataType = {};
myData[0] = "小明";
myData[1] = "小強";
myData['key'] = "小麗";

雖然可以同時使用兩種類型的索引,但需要注意:數字索引的返回值必須是字符串索引返回值類型的子類型。

類類型

比如我們希望定義的類都有一個屬性currentTime表示當前時間,那我們可以定義一個類接口,然後所有的類都實現這個接口。

定義

interface ClockInterface {
    currentTime: Date;
}

使用

class Clock implements ClockInterface {
    currentTime: Date;
    constructor() { 
        this.currentTime=new Date();
    }
}

繼承接口

比如和ClockInterface相比,我們有一個DateInterface接口,多了一個獲取保存的currentTime值的方法getValue:

定義

interface DateInterface extends ClockInterface {
    getValue(): Date;
}

使用

class MyDate implements DateInterface {
    currentTime: Date;
    getValue() {
        return this.currentTime;
    }
    constructor() {
        this.currentTime = new Date();
    }
}

混合類型

比如jQuery,他既是函數,也可以作為對象使用上面的屬性或方法。

定義

interface jQueryType {
    (selector: string): any;
    version: string;
    ajax(method: string, url: string, data: any, callback: Function): void
}

使用

let myJQuery = <jQueryType>function (selector: string): any {
    // todo
    return [];
};
myJQuery.version = '1.0.0';
myJQuery.ajax = function (method: string, url: string, data: any, callback: Function): void {
    // todo
};

這樣獲取的myJQuery本身是一個方法,同時有一個屬性version和一個方法ajax。

user avatar tigerandflower 頭像 susouth 頭像 liyl1993 頭像 nihaojob 頭像 u_12219 頭像 user_kim 頭像 wangji_5d01acdfdd139 頭像 chengxuyuanyouyage 頭像 2dian718 頭像
9 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.