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)
   }

至少,根据原型如何在打字稿上扩展?,这样的事情应该可以工作。

但是,这似乎隐藏了 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)之后,TypeScript 编译器也对预先存在的属性和方法感到满意HTMLElement。看这里

于 2013-03-18T16:11:36.463 回答