TS:ステートメント合併の美しさ

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.違法な合併

  • クラスを他のクラスとマージすることはできません!クラスを他のクラスとマージすることはできません!クラスを他のクラスとマージすることはできません!

おすすめ

転載: blog.csdn.net/yivisir/article/details/109863275