TypeScript类接口定义

时间:2015-05-15 15:55:54

标签: types typescript

我正在尝试为第三方库创建定义文件(*.d.ts)。该库有一个基类,用户对象最终将继承自该基类。但是,库处理这些对象的构造,并将自己的内置方法与用户定义的方法合并。因此,我不能创建用户类interface的{​​{1}},因为用户类没有从基类定义内置方法。

TypeScript定义implements文件:

d.ts

用户来源:

module otherlib {
    export interface Base {
        third_party_base_method(): string;
    }
}

我目前的解决方法是创建一个TypeScript文件(// FAILS because MyClass doesn't define third_party_base_method() class MyClass implements otherlib.Base { myfunc() { let str = this.third_party_base_method(); } } ),该文件定义*.ts而不是class,其基本类型中的所有方法都带有空体或返回虚拟值。然后,用户类可以interface从而进行类型检查。但是,这似乎非常hacky并导致不必要的和潜在危险的原型操纵。还有更好的方法吗?

TypeScript extend文件,用于定义第三方库基类:

.ts

用户来源:

module otherlib {
    export class Base {
        // Dummy stub definition that is never called
        third_party_base_method(): string { return "dummy"; }
    }
}

更新

事实上,我确实开始遇到使用空存根函数进行扩展的麻烦。所以,我的新解决方法只是创建一个存根以使铸造更容易......

TypeScript class MyClass extends otherlib.Base { myfunc() { // Proper type checking for calling the method that the // third party library adds to the object. let str = this.third_party_base_method(); } } 文件,用于定义第三方库基类:

d.ts

用于投射存根的TypeScript module otherlib { export interface Base { third_party_base_method(): string; } } 文件:

.ts

用户来源:

module otherlib_stub {
    export class Base {
        get base(): otherlib.Base { return <otherlib.Base><any>this; }
    }
}

1 个答案:

答案 0 :(得分:0)

您应该使用环境声明。这提供了类型信息,但不会在JavaScript输出中生成任何代码:

declare module otherlib {
    export class Base {
        third_party_base_method(): string;
    }
}

您可以将其放在包含.d.ts扩展名的文件中,以明确说明它不是实施文件。

更新!

这取决于第三方库的确切工作方式,但您可以使用界面将外部成员和本地成员包装成单一类型。

以下示例假设您调用一个返回扩展类的方法。如果你需要帮助来制作确切的版本,你必须提供一个实际工作原理的例子。

declare module otherlib {
    export interface Base {
        third_party_base_method(): string;
    }

    export function externalCodeThatExtendsYourClass<T>(obj: any): T;
}

// You would need the class/interface pair for each class
class Example {
    yourMethod() {
        alert('All yours');
    }
}

// The interface wraps the class members and the externally added members into a single type
interface ExtendedExample extends Example, otherlib.Base { }


var example = otherlib.externalCodeThatExtendsYourClass<ExtendedExample>(new Example());

example.third_party_base_method();
example.yourMethod();