我有一个正在转换为打字稿的大型现有项目,最终将被重构,然后放入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。如果有人能指出我的方向很好。
答案 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>