从2.7.x升级到2.8.x

时间:2018-04-10 07:18:43

标签: javascript typescript visual-studio-code

从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中获得的消息的屏幕截图: enter image description here

这是我的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

1 个答案:

答案 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文件,并获得更好的类型检查。

希望这能为你服务!