我正在尝试为第三方库创建定义文件(*.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; }
}
}
答案 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();