jQuery插件打字稿定义mixin

时间:2018-08-14 08:27:53

标签: jquery typescript jquery-plugins typescript-declarations

我正在用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的类型可以正确合并吗?

在我看来,这肯定是可能的。

1 个答案:

答案 0 :(得分:0)

如果使用模块系统,则必须将JQuery的扩展名放在全局名称空间中:

import {Foo} from './Foo';

declare global {
    interface JQuery {
        bar(): Foo;
    }
}

如果您不使用模块系统,则无需在Foo类上使用export,并且应该可以使用。