TS:ステートメントのマージ
1.基本的な考え方
- 宣言のマージとは、コンパイラが同じ名前の複数の独立した宣言を1つの宣言にマージすることを意味します。
- 結合されたステートメントには、同時に複数のステートメントの特性があります。
第二に、宣言の合併の種類
1.インターフェースのマージ
-
インターフェイスのマージのメカニズムにより、両方のパーティのメンバーが同じ名前のインターフェイスに配置されます。
-
インターフェイスの非関数メンバーは一意である必要があります。そうでない場合は、均一タイプである必要があります。同じ名前で異なるタイプの非関数メンバーが宣言されている場合、コンパイラはエラーを報告します。
interface Animal { name : string; age : number; } interface Animal { kind : string; } let cat : Animal = { name : 'hellokitty', age : 5, kind : cat } // ok
-
関数メンバーの場合、同じ名前の各関数宣言は、この関数のオーバーロードとして扱われます。
-
同時に、後で宣言されたインターフェイスの優先度が高いことに注意してください。
interface Cloner { clone(animal: Animal): Animal; } interface Cloner { clone(animal: Sheep): Sheep; } interface Cloner { clone(animal: Dog): Dog; clone(animal: Cat): Cat; } // 等同于 interface Cloner { clone(animal: Dog): Dog; clone(animal: Cat): Cat; clone(animal: Sheep): Sheep; clone(animal: Animal): Animal; }
-
このルールの1つの例外は、特別な関数シグネチャがある場合です。シグネチャパラメータタイプが単一のリテラル(たとえば、共用体タイプの文字列リテラルではない)文字列である場合、それは重いものになります。リストの。
interface Document { createElement(tagName : any) : Element; createElement(tagName : "div") : HTMLDivElement; } interface Document { createElement(tagName : string) : HTMLELement; createElement(tagName : "p") : HTMLPElement; } // 等同与 interface Document { createElement(tagName: "div"): HTMLDivElement; createElement(tagName: "p"): HTMLPElement; createElement(tagName: string): HTMLElement; createElement(tagName: any): Element; }
2.名前空間のマージ
-
名前空間内のエクスポートされたメンバーをマージする場合、指定された名前の名前空間がすでに存在する場合、後続の名前空間のエクスポートされたメンバーが既存のモジュールに追加されます。
namespace Animal { export class Cat { ... } export class Dog { ... } } namespace Animal { export interface Motion { eat : (food : string)=>void; } }
-
エクスポートされていないメンバーは、元の(事前にマージされた)名前空間でのみ表示されます。
-
他の名前空間からマージされたメンバーは、エクスポートされていないメンバーにアクセスできません。
3.名前空間とクラスの統合
-
名前空間の定義がマージされるクラスの定義に準拠している限り、名前空間をクラスとマージできます。
-
ルール
合并命名空间
について説明したのと同じセクションの上の統合ルールでは、クラスの名前空間をエクスポートして、クラスをマージするためにアクセスできるようにする必要があります。 -
マージの結果は、内部クラスを持つクラスです。名前空間を使用して、いくつかの静的プロパティをクラスに追加することもできます。
class Album { label: Album.AlbumLabel; } namespace Album { export class AlbumLabel { } }
-
内部クラスパターンに加えて、JavaScriptで関数を作成し、それを拡張していくつかの属性を追加するのが一般的です。TypeScriptは、宣言のマージを使用して、この目標を達成し、型の安全性を確保します。
function sayHelloTo(name : string) : string { return sanHelloTo.prefix + name + "!"; } namespace sayHelloTo { export let prefix = "Hello "; } console.log(sayHelloTo("yivi"));
4.名前空間と列挙のマージ
-
名前空間は、列挙を拡張するために使用できます。
enum Color { red = 1, green = 2, blue = 3 } namespace Color { export function mixColor (color : string){ if(color == "yellow"){ return Color.red + Color.green; }else if(color == "white"){ return Color.red + Color.green + Color.blue; }else if(color == "cyan"){ return Color.green + Color.blue; } } }
3.違法な合併
- クラスを他のクラスとマージすることはできません!クラスを他のクラスとマージすることはできません!クラスを他のクラスとマージすることはできません!