【发布时间】: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;
}
但是,此代码的问题在于它会覆盖任何现有的静态绑定(bind、call、create、freeze 等)。
我知道使用最新版本的 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 的未来版本中是否有任何计划来解决这个问题,正如建议的那样(或者确实有任何被证明更有效的修复)?
【问题讨论】:
-
这个问题真的应该在这里向 TypeScript 团队提出:github.com/Microsoft/TypeScript/issues
标签: javascript typescript