【问题标题】:Property 'toLowerCase' does not exist on type 'T[keyof T]'类型“T [keyof T]”上不存在属性“toLowerCase”
【发布时间】:2021-08-26 07:13:12
【问题描述】:

我正在尝试编写一个具有两个 args(obj 数组和搜索词的数组)的泛型类型的函数,但我收到一个错误 - Property 'toLowerCase' 在类型 'T[keyof T] 上不存在'

这里是函数:

function matchSearchTerm<T>(data: T[], search: string): T[] {
  return data.filter((obj) => {
    const filteredData = (Object.keys(obj) as Array<keyof typeof obj>).some((value) => {
      return (
        typeof obj[value] === "string" && obj[value].toLowerCase().includes(search.toLowerCase())
      );
    });
    return filteredData;
  });
}

这里缺少什么?

【问题讨论】:

  • 您的数组是泛型类型T,而函数toLowerCase() 未在该类型上定义,因此出现错误消息。您需要将数组项转换为string

标签: javascript arrays typescript generics javascript-objects


【解决方案1】:
function matchSearchTerm<T extends Record<string, string>>(data: T[], search: string) {
  return data.filter((obj) => {
    const filteredData = (Object.keys(obj) as Array<keyof T>).some((value) => {
      const checkIt = obj[value]
      return (
        typeof obj[value] === "string" && obj[value].toLowerCase().includes(search.toLowerCase())
      );
    });
    return filteredData;
  });
}

只需为您的T 泛型参数添加额外的约束:T extends Record&lt;string, string&gt;

【讨论】:

    【解决方案2】:

    这个怎么样:

    return obj[value]['toLowerCase']?.call(obj[value]).includes(search.toLowerCase())
    

    在我看来,它返回 true/false/undefined -> 过滤器很好......或者我们可以使用一些三元运算符,如果我们只想要 true/false......

    【讨论】:

      【解决方案3】:

      似乎与这个问题有关:https://github.com/microsoft/TypeScript/issues/10530

      您仍然可以将obj[value] 拉出到变量中以获取类型推断:

      function matchSearchTerm<T>(data: T[], search: string): T[] {
        return data.filter((obj) => {
          const filteredData = (Object.keys(obj) as Array<keyof typeof obj>).some((value) => {
            const val = obj[value];
            return (
              typeof val === "string" && val.toLowerCase().includes(search.toLowerCase())
            );
          });
          return filteredData;
        });
      }
      

      【讨论】:

        猜你喜欢
        • 2021-07-19
        • 1970-01-01
        • 2021-11-13
        • 1970-01-01
        • 2020-11-07
        • 2019-12-09
        • 2020-03-29
        • 1970-01-01
        • 2019-11-17
        相关资源
        最近更新 更多