首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在TypeScript中使用“开放接口”扩展HTMLElement

在TypeScript中使用“开放接口”扩展HTMLElement
EN

Stack Overflow用户
提问于 2013-03-18 21:59:37
回答 2查看 2.3K关注 0票数 3

我想用额外的方法扩展内置的类HTMLElement。也许我要疯了,但我认为以下是官方成语:

代码语言:javascript
复制
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)
   }

至少,根据How does prototype extend on typescript?的说法,这样的东西应该可以工作。

然而,这似乎隐藏了HTMLElement上的所有现有方法。这是因为我声明了一个接口,它隐藏了同名的类吗?但是这个习惯用法似乎可以很好地用于Object和Array,它们也是类。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-18 23:16:08

扩展接口必须在代码的根级别进行。如果您尝试在模块内扩展接口,则该模块内的代码只能看到该作用域内的接口。

打碎的例子:

代码语言:javascript
复制
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.
        }
    }
}

工作示例:

代码语言:javascript
复制
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 :)
        }
    }
}
票数 6
EN

Stack Overflow用户

发布于 2013-03-19 00:11:36

它对我来说工作得很好-在我声明了额外的方法(使用不同的名称以避免与现有的swapChildrenBefore冲突)之后,TypeScript编译器对HTMLElement的预先存在的属性和方法也很满意。请参阅here

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15478653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档