你可以这样试试:
export function foo = function() { ... };
someClass.prototype.foo = foo;
declare module 'someNPMmodule' {
export interface someClass {
foo: typeof foo;
}
}
此代码扩充了导入的模块。模块的名称必须与导入中使用的名称相同,包括路径:
我的意思是,如果你有:
import { someClass } from '@author/library'
那么你必须将模块定义为
declare module '@author/library';
接下来在模块中声明一个与要扩展的类同名的接口,并向其中添加属性定义。现在,在该模块声明之外,您可以向 someClass 的原型添加一个新方法,TypeScript 会识别它。
编辑:
如果您在另一个接口中定义了该方法,就像您的情况一样,您也可以这样做:
export interface myInterface {
foo: () => void
}
export function foo = function() { ... };
someClass.prototype.foo = foo;
declare module 'someNPMmodule' {
export interface someClass extends myInterface { }
}
无论如何,为了记录,在 TypeScript 中实现接口意味着只具有具有相同类型的相同属性,因为 TypeScript 使用结构类型。
这意味着:
interface A { foo: () => void }
class AImp implements A {
foo() { console.log(''); }
}
class BImp {
foo() { console.log(''); }
}
const arr: A[] = [];
arr.push(new AImp());
arr.push(new BImp());
这有效,即使BImp 没有明确指出它实现了接口。那是因为接口只是说符合它的对象必须具有() => void 类型的foo 方法。 BImp有这样的方法,所以隐含了接口。
同样,在我的第一个示例中,someClass 也将通过声明其方法来实现 myInterface。
如果您对此解决方案有任何疑问,请发表评论。