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;
};如此一來,IFoo2將IFoo進行擴充,也可以使用something此項欄位
type和interface使用上差不多,可是如果使用在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
留言
張貼留言