十三、合併を宣言する


紹介する


コンパイラが同じ名前の2つの独立した宣言を単一の宣言にマージし、マージ後の宣言が元の2つの宣言の特性を持つことを指します.
注意:任意の数の宣言をマージできます.
//  
interface Box {
  height: number;
  width: number;
}
interface Box {
  scale: number;
}
let box: Box = {height: 5, width: 6, scale: 10};
console.log(box)

TSの宣言により、次の3つのエンティティのいずれかが作成されます.
  • ネーミングスペース:使用(.)を含む新しいネーミングスペースが作成されます.シンボルアクセス時に使用される名前
  • タイプ:宣言されたモデルでタイプを作成し、指定された名前にバインドする
  • 値:JS出力で見られる値
  • が作成されます.
    マージインタフェース:最も簡単で最も一般的なマージタイプはインタフェースのマージです.マージメカニズムは、双方のメンバーを同じ名前のインタフェースに配置することです.
    注意事項:
  • インタフェースの非関数メンバーは一意であるべきであり、一意でない場合は同じタイプでなければなりません.そうしないと、
  • とエラーが発生します.
  • 関数メンバーの場合、各同名関数宣言は、この関数のリロードとして扱われます.注意:同名インタフェースの後ろのインタフェースは、
  • より高い優先度を有します.
    //  
    interface Animal {}
    interface Sheep {}
    interface Dog {}
    interface Cat {}
    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;
    }

    例外:特殊な関数署名が発生した場合、署名にパラメータのタイプが単一の文字列の字面量である場合、彼はリロードリストの最上位に昇格します.
    //  
    interface Document {
      createElement(tagName: any): Element;
    }
    interface Document {
      createElement(tagName: 'div'): HTMLDivElement;
      createElement(tagName: 'span'): HTMLSpanElement;
    }
    interface Document {
      createElement(tagName: string): HTMLElement;
      createElement(tagName: "canvas"): HTMLCanvasElement;
    }
    //  
    interface Document {
      createElement(tagName: "canvas"): HTMLCanvasElement;
      createElement(tagName: "div"): HTMLDivElement;
      createElement(tagName: "span"): HTMLSpanElement;
      createElement(tagName: string): HTMLElement;
      createElement(tagName: any): Element;
    }

    ネーミングスペースのマージ


    インタフェースと同様に、同じ名前のネーミングスペースもメンバーを結合します.
  • ネーミングスペースのマージについては、モジュールが導出同名のインタフェースがマージされ、単一ネーミングスペースにマージ後のインタフェース
  • が含まれる.
  • ネーミングスペースはマージする価値があり、現在すでに指定された名前のネーミングスペースが存在する場合、その後のネーミングスペースの導出メンバーは、すでに存在するモジュールに
  • 加算される.
  • 非エクスポート・メンバーのマージでは、マージ後に他のネーミングスペースからマージされたメンバーは非エクスポート・メンバー
  • にアクセスできません.
    namespace Animals {
      export class Zebra {}
    }
    namespace Animals {
      export interface Legged { numberOfLegs: number; }
      export class Dog {}
    }
    //  
    namespace Animals {
      export interface Legged { numberOfLegs: number; };
      export class Zebra { }
      export clasas Dog { }
    }
    //  
    namespace Animal {
      let haveMuscles = true;
    
      export function animalsHaveMuscles() {
          return haveMuscles;
      }
    }
    // doAnimalsHaveMuscles , 
    namespace Animal {
      export function doAnimalsHaveMuscles() {
          // return haveMuscles;  // Error, because haveMuscles is not accessible here
      }
    }