Typescript 2 使用 interface,module,namespace,alias type 和簡單提 declare

在處理typescript宣告型別的中,最常的是先利用interface / type去做基本定義宣告

interface IFoo {
    bar: string;
}

在這層的關係裡面,只要有宣告const anything: IFoo裡面帶的內容就是要照著開出的interface / type去做,要不然會有error而無法正常compile

而重複命名的interface型別會進行再對其做屬性擴充

interafce IFoo {
    something: string;
}

interface IFoo {
    bar: string;
}

//same as

interface IFoo {
    something: string;
    bar: string;
}

type的情況跟interface像但是又有點不一樣

就基本的宣告來說的話

type IFoo = {
    bar: string;
}

其實對於使用上來說,type和interface差距不大,不過還是有主要的區別的,type可以對已經定義的typescript型別再命名type alias,例如說

interface IFoo {
    bar: string;
}

type IFoo2 = IFoo;

這樣就可以對該項型別重新命名了,而有此項功能的type,就可以對相關參數進行更詳細定義

例如說1 / 0這個是在php裡面傳值時也會使用到的boolean型別,既然如此,我就可以將他這樣定義

type IPHPBoolean = 1 | 0;

注意,|這個為typescript2新增的運算子,為union的運算子,照上面sample來說,即為1或者0,同意or。後續會對常用operator再做解說

type要如何進行擴充呢?

type IFoo = {
    bar: string;
};

type IFoo2 = IFoo & {
    something: string;
};

如此一來,IFoo2IFoo進行擴充,也可以使用something此項欄位

typeinterface使用上差不多,可是如果使用在editor上尤其是 vscode ,我其實有時候會比較偏愛type,至於為什麼...



對,type可以顯示細節!就這個方面如果有需求,我就會使用type來進行宣告了

再來是對module及namespace上實作

module通常就是對module進行定義,例如引用的library沒有definition,或者使用到特殊檔案型別使用loader引入,可是 typescript 不認得,我就可以用module去定義。

// 注意 module 名稱要和使用的package name一樣
declare module 'foo' {
    // method, content
}
  • 另外這邊順便提一下 declare ,當使用到這個關鍵字,代表不需要使用 import 去額外引入,這項參數會在 tsconfig 設定的範圍內全域共用,算是 global type 要特別注意使用。

namespace 即命名空間,使用在同樣行為的 scope 底下,這個我通常比較少用到,流行functional programing 的當下,namespace 算是我比較少用到的部分。實作中,大概都是將作用相同或者以page為單位去做 namespace 的設定。

export namespace Foo {
    // content
}

注意,使用namespace的同時,如果要讓非 namespace 的使用其中的資料,需要將其 export 出來。

namespace Foo {
    export function bar () {};
}

另外 namespace 當中的值是可以被改寫繼承的,所以使用上也要注意這個特性。

再來, namespace 當中雖然可以使用於 definition 的檔案中(即.d.ts),但是當裡面有實作的 function 或者 value,就會彈出錯誤警告不能在宣告環境進行實作。


下一篇:Typescript 3 Typescript 使用,那些奇怪的符號: operators, private, decorator, generic type

留言

這個網誌中的熱門文章

ts-node 應用

ubuntu 日常(X)紀錄

Angular 2 with Third Party files