Недавно я задал вопрос о возможности TypeScript расширять существующие прототипы в JavaScript API (здесь: Расширение Object.prototype с помощью TypeScript).
Это оказалось ошибкой, которая с тех пор была решена как TypeScript 0.9.0 Alpha (которая теперь включает в себя дженерики... GREAT: -))
В 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 foo again!
}
Но я не могу это сделать в TypeScript.
Сначала я попытался выяснить, было ли открыто объявление объекта (как с интерфейсами):
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 (я на работе, поэтому я на самом деле не пробовал ее полностью).
Может ли кто-нибудь пролить свет на это?