3

組み込みクラス HTMLElement を追加のメソッドで拡張したいと思います。頭がおかしいのかもしれませんが、公式のイディオムは次のとおりだと思いました。

interface HTMLElement {
   swapChildBefore(remove: HTMLElement, insert: HTMLElement, before: HTMLElement): void;
}

HTMLElement.prototype.swapChildBefore =
   function (remove: HTMLElement, insert: HTMLElement, before: HTMLElement): void {
      this.removeChild(remove)
      this.insertBefore(insert, before)
   }

少なくとも、プロトタイプは typescript でどのように拡張されますか?によると、、このようなものが機能するはずです。

ただし、これは HTMLElement の既存のメソッドをすべて隠しているようです。それは、同じ名前のクラスを非表示にするインターフェイスを宣言したためですか? しかし、このイディオムは、クラスでもある Object と Array ではうまく機能するようです。

4

2 に答える 2

6

インターフェイスの展開は、コードのルート レベルで行う必要があります。モジュール内のインターフェイスを拡張しようとすると、そのモジュール内のコードはそのスコープ内のインターフェイスのみを認識します。

壊れた例:

interface ExpandableInterface {
    memberOfFIRSTDefinition: number;
}

module MyModule {
    interface ExpandableInterface {
        memberOfSECONDDefinition: number;
    }

    class MyClass {
        constructor() {
            var m: ExpandableInterface = {};
            m.memberOfFIRSTDefinition; // <-- It can't see this member because it's only scoped to the one inside of the module.
        }
    }
}

作業例:

interface ExpandableInterface {
    memberOfFIRSTDefinition: number;
}

interface ExpandableInterface {
    memberOfSECONDDefinition: number;
}

module MyModule {
    class MyClass {
        constructor() {
            var m: ExpandableInterface = {};
            m.memberOfFIRSTDefinition; // <-- They're both root level, it can be seen :)
        }
    }
}
于 2013-03-18T15:16:07.610 に答える
2

それは私にとってはうまくいきます.追加のメソッドを宣言した後(swapChildrenBefore既存のHTMLElement. こちらをご覧ください

于 2013-03-18T16:11:36.463 に答える