使用TypeScript在现有原型上扩展实例/静态函数

ser*_*0ne 14 javascript prototype typescript

我最近问了一个关于TypeScript在JavaScript API中扩展现有原型的能力的问题(这里:使用TypeScript扩展Object.prototype).

事实证明这是一个bug,从那时起就被解决了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[];
}
Run Code Online (Sandbox Code Playgroud)

所以,我之前的问题是关于扩展Object的接口,如下所示:

interface Object {
    GetFoo(): Foo;
}

Object.prototype.GetFoo = function() {
    return new Foo();
}
Run Code Online (Sandbox Code Playgroud)

如上所述,这适用于TypeScript 0.9.0.

但现在我也希望能够向Object添加静态函数,在纯JavaScript中完全合法.

在JavaScript中我会这样做:

Object.FooAgain = function () {
    // Yes, it's foo again!
}
Run Code Online (Sandbox Code Playgroud)

但我似乎无法在TypeScript中完成此任务.

首先,我试着看看Object的声明是否是开放的(与接口一样):

declare var Object: {
    FooAgain(): void;
}

Object.FooAgain = function () {
    // TS doesn't like this, and Object.FooAgain isn't available in intellisense.
}
Run Code Online (Sandbox Code Playgroud)

我也尝试过(我在另一篇文章中看到了这一点,并认为值得一试).

export declare var Object: {
}
Run Code Online (Sandbox Code Playgroud)

但这似乎打破了一切......

不可否认,这个问题也可能已经在TS 0.9.0中得到修复(我正在工作,所以我还没有完全尝试过).

任何人都可以对此有所了解吗?

Ste*_*orn 14

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

静态类型定义都命名为[Type]Constructor:所以如果要添加静态函数来键入Object,则将定义添加到ObjectConstructor.

定义:

interface ObjectConstructor
{
    FooAgain(): void;
}
Run Code Online (Sandbox Code Playgroud)

执行:

Object.FooAgain = function(): void
{
    // Oh noes, it's foo again!
}
Run Code Online (Sandbox Code Playgroud)