Jquery和Typescript [ts]类型为“string |数字|字符串[]'不能分配给'string'类型的参数。

问题描述:

我有一个大的现有项目正在转换为打字稿,并最终被重构,然后放入Angular。目前的项目中有很多Jquery。我在项目中实现了当前的@types。Jquery和Typescript [ts]类型为“string |数字|字符串[]'不能分配给'string'类型的参数。

的问题是,这条线

if (["Priority", "PM"].indexOf($('option:selected', this).val()) >= 0) { 

,是因为类型定义创建一个错误。我得到[TS]类型为'string |的参数数字|字符串[]'不能分配给'string'类型的参数。因为indexOf被定义为“(method)Array.indexOf(searchElement:string,fromIndex ?: number):number”,并且Jquery的.val被定义为“jQuery.val():string | number | string [](+1超载)”。

我需要一种方法来重写.val定义,以便我可以让它编译,像这样的行,而不必覆盖整个项目的.val。我在项目中有很多这样的行,所以我不能只重写他们中的每一个。最终我们将完全摆脱Jquery。如果任何人都可以指出我认为正确的方向。

我终于想出了如何使它工作。我能够将类型字符串转换为它。因为我有这样的项目确切的行几个地方我创建了这样一个变量:

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

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

这让我确保该.VAL类型是其匹配Array.indexOf的要求的indexOf一个字符串(searchElement :string。希望这可以帮助某人

+0

听起来像当前最好的方法是'let optSel:string =($('option:selected',this).val()as string);' – bcr

你目前的方法是一个有效的解决方案,但是这将需要你将所有的$('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),否则我建议只在顶部添加的环境类型声明你的当前文件。