Jquery和Typescript [ts]类型'string |的参数号码| string []'不能分配给'string'类型的参数。

时间:2017-09-01 20:30:52

标签: jquery typescript types

我有一个正在转换为打字稿的大型现有项目,最终将被重构,然后放入Angular。当前项目中有很多Jquery。我在项目中实现了当前的@types。

问题是这一行

if (["Priority", "PM"].indexOf($('option:selected', this).val()) >= 0) {
由于类型定义,

正在创建错误。我得到[TS]类型为'string |的参数号码| string []'不能赋值给'string'类型的参数。因为indexOf定义为“(方法)Array.indexOf(searchElement:string,fromIndex?:number):number”和Jquery的.val定义为“JQuery.val():string | number | string [](+ 1)超载)”。

我需要一种方法来覆盖.val定义,只是字符串,以便我可以编译它,对于这样的行而不覆盖整个项目的.val。我在项目中有很多这样的行,所以我不能只重写它们中的每一个。最终我们将彻底摆脱Jquery。如果有人能指出我的方向很好。

2 个答案:

答案 0 :(得分:4)

我终于想出了如何让它发挥作用。我能够将类型字符串转换为它。由于我在项目中的几个地方有这个确切的行,我创建了一个这样的变量:

let optSel: string = <string>$('option:selected', this).val();

if ($(["Priority", "PM"]).index(optSel) >= 0) {

这使我能够确保.val类型是一个与Array.indexOf(searchElement:string)的indexOf要求相匹配的字符串。希望这有助于某人。

答案 1 :(得分:1)

您当前的方法是一种有效的解决方案,但这需要您将$('option:selected').val()的所有匹配项转换为预期的string类型。你可能想要考虑的事情是利用环境声明来覆盖/扩展到JqueryStatic中的@types/jquery接口。

interface JQueryStatic {
    (opts: 'option:selected', ...args): {
        val: () => string;
    };
}

每当调用$('option:selected', ...)时,此调用的定义将坚持返回的对象包含返回字符串值的val方法。

let value: string = $('option:selected').val();

如果你在多个文件的整个项目中使用它,你可以为它创建一个声明文件(* d.ts),否则我建议只在当前文件的顶部添加环境类型声明。 / p>