我正在用TypeScript编写一个JQuery插件。
我有一个Foo.ts
类的实现
//Foo.ts
export class Foo {}
我已经安装了@types/jquery
,并且可以正常工作。
现在,我想在JQuery
类型上声明一个函数,我可以像这样对types.d.ts
文件进行操作:
//types.d.ts
interface JQuery {
bar(): string;
}
这可以让我做
//Baz.ts
let result: string = $('#Baz').bar();
但是,bar()
的返回类型不是string
,而应该是Foo
。
//types.d.ts
//import {Foo} from './Foo';
interface JQuery {
bar(): Foo;
}
在Foo
[ts] Cannot find name 'Foo'
下给我一个红线。如果我取消对导入行的注释,types.d.ts
很高兴,但是随后我得到了一个错误
//Baz.ts
let result: string = $('#Baz').bar();
// [ts] Property 'bar' does not exist on type 'JQuery<HTMLElement>'.
似乎JQuery
的定义不再合并。我知道类型声明文件如果具有导入或导出,则不是全局的,但是我不知道如何在其他文件中引用类型。
如何在JQuery
类型上声明附加功能,谁的定义引用了其他类型?
另外,可以这样做,以便当我将该模块导入另一个项目时,JQuery
的类型可以正确合并吗?
在我看来,这肯定是可能的。
答案 0 :(得分:0)
如果使用模块系统,则必须将JQuery
的扩展名放在全局名称空间中:
import {Foo} from './Foo';
declare global {
interface JQuery {
bar(): Foo;
}
}
如果您不使用模块系统,则无需在Foo
类上使用export,并且应该可以使用。