【问题标题】:Jquery and Typescript [ts] Argument of type 'string | number | string[]' is not assignable to parameter of type 'string'.Jquery 和 Typescript [ts] 类型参数 'string |号码 | string[]' 不能分配给“string”类型的参数。
【发布时间】:2018-02-10 22:54:20
【问题描述】:

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

问题在于这一行

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

由于类型定义而产生错误。我得到 [TS] 类型参数 'string |号码 | string[]' 不能分配给“string”类型的参数。因为 indexOf 被定义为“(method) Array.indexOf(searchElement: string, fromIndex?: number): number”而Jquery的.val被定义为“JQuery.val(): string | number | string[] (+1超载)”。

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

【问题讨论】:

    标签: jquery typescript types


    【解决方案1】:

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

    let optSel: string = <string>$('option:selected', this).val();
    
    if ($(["Priority", "PM"]).index(optSel) >= 0) {
    

    这让我可以确保 .val 类型是一个字符串,它与 Array.indexOf(searchElement: string.) 的 indexOf 要求相匹配。希望这对某人有所帮助。

    【讨论】:

    • 听起来目前最好的方法是let optSel: string = ($('option:selected', this).val() as string);
    【解决方案2】:

    您当前的方法是一个有效的解决方案,但这需要您将所有出现的$('option:selected').val() 转换为预期的string 类型。您可能需要考虑使用环境声明,在其中覆盖/扩展至 @types/jquery 中的 JqueryStatic 接口。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-27
      • 1970-01-01
      • 2021-10-02
      • 2021-09-06
      • 2021-10-06
      • 2020-04-15
      • 2021-11-11
      相关资源
      最近更新 更多