【问题标题】:TypeScript static interface bindingTypeScript 静态接口绑定
【发布时间】:2014-11-26 08:38:27
【问题描述】:

我问了几个与在 JavaScript 中扩展现有对象的静态功能相关的问题(使用 TypeScript)。为了这里所有的例子,我使用Object

以下代码演示了 ECMAScript 的 Object.is 函数的 polyfill 定义

Object.is = function(value1: any, value2: any): boolean {
    // ....impl
};  // ERROR : Property 'is' does not exist on type...

之所以这样是因为is没有在Object上实现,但是我们可以像这样让它可见

declare var Object: {
    is(value1: any, value2: any): boolean;
}

但是,此代码的问题在于它会覆盖任何现有的静态绑定(bindcallcreatefreeze 等)。

我知道使用最新版本的 TypeScript,我们现在可以将开放式接口静态绑定到对象声明:

interface _Object {
    is(value1: any, value2: any): boolean;
}

declare var Object: _Object;

这很好,因为正如所指出的,TypeScript 中的接口是开放式的,因此我可以不断地将越来越多的功能绑定到Object,但这并不能解决一旦接口绑定到Object 的问题,它会覆盖现有的声明,因为 lib.d.ts 仍然像这样声明 Object

declare var Object: {
    new (value?: any): Object;
    (): any;
    (value: any): any;
    prototype: Object;
    getPrototypeOf(o: any): any;
    getOwnPropertyDescriptor(o: any, p: string): PropertyDescriptor;
    getOwnPropertyNames(o: any): string[];
    create(o: any, properties?: PropertyDescriptorMap): any;
    defineProperty(o: any, p: string, attributes: PropertyDescriptor): any;
    defineProperties(o: any, properties: PropertyDescriptorMap): any;
    seal(o: any): any;
    freeze(o: any): any;
    preventExtensions(o: any): any;
    isSealed(o: any): boolean;
    isFrozen(o: any): boolean;
    isExtensible(o: any): boolean;
    keys(o: any): string[];
}

我觉得这里需要重构lib.d.ts 中的代码以允许开放式 接口静态绑定到声明,就像这样

interface _Object {
    new (value?: any): Object;
    (): any;
    (value: any): any;
    prototype: Object;
    getPrototypeOf(o: any): any;
    getOwnPropertyDescriptor(o: any, p: string): PropertyDescriptor;
    getOwnPropertyNames(o: any): string[];
    create(o: any, properties?: PropertyDescriptorMap): any;
    defineProperty(o: any, p: string, attributes: PropertyDescriptor): any;
    defineProperties(o: any, properties: PropertyDescriptorMap): any;
    seal(o: any): any;
    freeze(o: any): any;
    preventExtensions(o: any): any;
    isSealed(o: any): boolean;
    isFrozen(o: any): boolean;
    isExtensible(o: any): boolean;
    keys(o: any): string[];
}

declare var Object: _Object;

因此,当我为Object.is 创建我的界面以及它的附带函数时,一切都应该和谐地工作

我想知道的是,在 TypeScript 的未来版本中是否有任何计划来解决这个问题,正如建议的那样(或者确实有任何被证明更有效的修复)?

【问题讨论】:

标签: javascript typescript


【解决方案1】:

由于 TypeScript 1.4 可以轻松添加静态扩展。 TypeScript 团队更改了 lib.d.ts 文件以使用所有静态类型定义的接口。

静态类型定义都被命名为[Type]Constructor:所以如果你想添加一个静态函数到类型Object,然后将你的定义添加到ObjectConstructor

定义:

interface ObjectConstructor
{
    is(value1: any, value2: any): boolean;
}

实施:

Object.is = function(value1: any, value2: any): boolean
{
    // your implementation here
}

【讨论】:

    【解决方案2】:

    我想知道的是,在 TypeScript 的未来版本中是否有任何计划来解决这个问题,正如建议的那样(或者确实有任何被证明更有效的修复)?

    已经在这里提出:https://github.com/Microsoft/TypeScript/issues/182

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-22
      • 2012-12-06
      • 1970-01-01
      • 2020-11-24
      • 1970-01-01
      • 1970-01-01
      • 2012-10-29
      • 1970-01-01
      相关资源
      最近更新 更多