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
留言
張貼留言