我有一个 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;
答案 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
);