从TypeScript 2.7.x升级到2.8.1后,我使用.ts
(.js
} $
和$(selector).text('Amiga Forever')
文件中的所有jQuery调用都会出现以下错误(如{{{ 1}},我在版本2.7中没有得到:
error TS2349: Cannot invoke an expression whose type lacks a call signature. Type 'typeof $' has no compatible call signatures.
我没有更改代码中的任何内容,只是升级了TypeScript编译器。我在"@types/jquery": "^2.0.49"
中使用了package.json
。升级到最新的jQuery类型没有帮助。
修改
这是一个代码示例。我的代码只使用命名空间但没有模块构建:
namespace My.Controller {
export class TextController extends ControllerBase {
constructor() {
super();
}
public setText(text: string) {
$(this._textSelector).text(text);
}
}
}
EDIT2:
当我悬停$
时,这是我在Visual Studio Code中获得的消息的屏幕截图:
这是我的tsconfig.json:
{
"compilerOptions": {
"target": "es6",
"allowJs": true,
"module": "none",
"sourceMap": true,
"outDir": "./dist"
},
"include": [
"source/**/*",
"source/index.html"
]
}
我还尝试将类型添加到编译器选项(见下文),这对以下任何一种都没有帮助:
"types": [
"jquery"
]
EDIT3:
通过在.js
文件中扩展jQuery功能而不是使用.ts
文件来解决问题。请参阅接受的答案了解详情。
但它仍然不清楚,为什么行为从TS 2.7.x变为TS 2.8.x
答案 0 :(得分:1)
我并不完全知道为什么TypeScript 2.8会对此提出抗议。也许它改进了从JavaScript文件推断类型的方式。
现在,在TypeScript中添加JQuery扩展很容易。例如,doesExist
方法:
首先,您需要一个声明文件,您可以在其中声明更改。例如,jquery-custom.d.ts
。
在该文件中,我们修改了接口JQuery
,并且,由于TypeScript合并声明,我们最终得到了一个包含所有方法的接口:
declare interface JQuery {
doesExist: () => boolean
// ... other custom methods ...
}
现在,您告诉TypeScript JQuery
个对象有doesExist
方法。当然,我们需要真正定义该方法,否则我们将遇到运行时错误。所以我们添加另一个文件(你不能在环境声明文件中添加句子),jquery-custom.ts:
$.fn.doesExist = function(): boolean {
return this.length > 0;
}
您必须在应用程序的入口点(jquery-custom.ts
)导入import './jquery-custom.ts'
,然后才能安全地使用该扩展程序。您不需要导入d.ts
文件,因为TypeScript会隐式识别它们,就像node_modules/@types
下的那些一样。
通过这种方式,您可以摆脱以前拥有这些扩展的JavaScript文件,并获得更好的类型检查。
希望这能为你服务!