我最近问了一个关于 TypeScript 在 JavaScript API 中扩展现有原型的能力的问题(这里:Extending Object.prototype with TypeScript)。
结果证明这是一个错误,自 TypeScript 0.9.0 Alpha 起已解决(现在包括泛型......很棒 :-))
在 TypeScript 中,接口是开放式的,所以如果你查看lib.d.ts,你会发现一个接口定义了 JavaScript 的 Object API 的契约。您还应该看到 Object 的变量声明,它定义了 Object 的静态函数。
为了简单起见,它们是:
//Pulled from lib.d.ts
interface Object {
toString(): string;
toLocaleString(): string;
valueOf(): Object;
hasOwnProperty(v: string): bool;
isPrototypeOf(v: Object): bool;
propertyIsEnumerable(v: string): bool;
[s: string]: any;
}
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): bool;
isFrozen(o: any): bool;
isExtensible(o: any): bool;
keys(o: any): string[];
}
所以,我之前的问题是关于扩展 Object 的接口,如下所示:
interface Object {
GetFoo(): Foo;
}
Object.prototype.GetFoo = function() {
return new Foo();
}
如前所述,这适用于 TypeScript 0.9.0。
但现在我也希望能够向 Object 添加静态函数,这在纯 JavaScript 中是完全合法的。
在 JavaScript 中,我会这样做:
Object.FooAgain = function () {
// Yes, it's foo again!
}
但我似乎无法在 TypeScript 中实现这一点。
首先,我尝试查看 Object 的声明是否是开放式的(与接口一样):
declare var Object: {
FooAgain(): void;
}
Object.FooAgain = function () {
// TS doesn't like this, and Object.FooAgain isn't available in intellisense.
}
我也尝试过(我在另一篇文章中看到了这一点,并认为值得一试)。
export declare var Object: {
}
但这似乎更打破了一切......
诚然,这个问题也可能在 TS 0.9.0 中得到修复(我正在工作,所以我实际上并没有完全尝试过)。
任何人都可以对此有所了解吗?