打字稿:处理泛型类型的keyof

时间:2021-07-28 15:25:43

标签: typescript

我有一个 React + TS 应用程序,但遇到了问题。我正在编写一个函数来过滤一些数据:

    function matchesFilter(element: T, filter: Filters) {
      const { name, options } = filter;
      return options.filter(selected => selected).some(value => value === element[name]);
    }

我使用泛型类型 T,因为要过滤的元素可以是不同的格式。 这就是我正式化 Filters 的方式:

export type Filter = {
  name: string;
  value: string;
  selected: boolean;
};

export type Filters = {
  name: string;
  options: Filter[];
};

问题是我有这个错误:

<块引用>

元素隐式具有“任何”类型,因为类型的表达式 'string' 不能用于索引类型 'unknown'。无索引签名 在类型 'unknown'.ts(7053)

上找到了类型为 'string' 的参数

element[name]

我猜打字稿是想说类型“字符串”(name)不能用作访问对象 element 的属性的键,但是我该如何解决这个问题?

>

更新:这是我正在编写的自定义钩子的更完整版本,类型是泛型类型:

const useUpdateFilters = <T>(elements: T[], filterConfiguration: Filters[]) => {
  const [filters, setFilters] = useState(filterConfiguration);
  const [filteredObjects, setFilteredRequests] = useState<T[]>([]);

  useEffect(() => {
    function matchesFilter(element: T, filter: Filters) {
      const { name, options } = filter;
      return options.filter(selected => selected).some(value => value === element[name]);
    }

    function matchesAllFilters(element: T, filtersToMatch: Filters[]) {
      return filtersToMatch.every(filterToMatch => matchesFilter(element, filterToMatch));
    }

    setFilteredRequests(elements.filter((element: T) => matchesAllFilters(element, filters)));
  }, [filters, elements]);

  return {
    filters,
    filteredObjects,
  };
};

export default useUpdateFilters;

1 个答案:

答案 0 :(得分:0)

由于您明确希望所有元素都有名称,您可以将此期望传递给 TS,它应该停止抱怨:

UPDATE tbl_A A  
   SET column_Name = 'Y' 
   WHERE NOT EXISTS (SELECT 1
                     FROM tbl_B B
                     WHERE A.Matching_Column_Name = B.Matching_Column_Name
                    );