typescript - 如何在 Typescript 中为过滤函数编写类型以避免重载错误?
问题描述
我有这种情况:
type TMapStateToProps = (state: TObjectAny, props: {resource: string, namespace: string }) => ({
savedFilters: TObjectAny
});
export const mapStateToProps: TMapStateToProps = (state, { resource, namespace = '_' }) => {
return {
savedFilters: Object.values(
get(state, 'admin.resources.settings/user-data.data', {})
)
.filter((({ key_name }: any): boolean => key_name === getSavedFiltersKey(resource, namespace)))
.reduce((prev: any, cur: any) => {
try {
const filter = JSON.parse(cur.data.filter);
prev[cur._id] = {
name: cur.data.name,
filter,
};
} catch (e) {
console.error(e);
}
return prev;
}, {}),
};
};
产生的
Object.values(get(state, 'admin.resources.settings/user-data.data', {}))
是一个空对象或一个对象数组,其中每个对象都具有以下结构:
type TObjectFilter = {
created_at: string,
data: TObjectAny
id: string,
key_name: string,
public: boolean,
updated_at: string,
user: string,
_id: string,
}
如果我使用
filter((({ key_name }: any): boolean => key_name === getSavedFiltersKey(resource, namespace)))
so any
,一切正常,但我想使用正确的类型并编写:
filter((({ key_name }: {key_name:string}): boolean => key_name === getSavedFiltersKey(resource, namespace)))
在这种情况下,我在过滤器函数中收到以下错误:
No overload matches this call.
Overload 1 of 2, '(predicate: (value: unknown, index: number, array: unknown[]) => value is unknown, thisArg?: any): unknown[]', gave the following error.
Argument of type '({ key_name }: { key_name: string; }) => boolean' is not assignable to parameter of type '(value: unknown, index: number, array: unknown[]) => value is unknown'.
Types of parameters '__0' and 'value' are incompatible.
Type 'unknown' is not assignable to type '{ key_name: string; }'.
Overload 2 of 2, '(predicate: (value: unknown, index: number, array: unknown[]) => unknown, thisArg?: any): unknown[]', gave the following error.
Argument of type '({ key_name }: { key_name: string; }) => boolean' is not assignable to parameter of type '(value: unknown, index: number, array: unknown[]) => unknown'.
Types of parameters '__0' and 'value' are incompatible.
Type 'unknown' is not assignable to type '{ key_name: string; }'.
我对 TS 很陌生,我花了很多时间环顾四周,发现了一些与谓词和强制类型相关的类似问题,我试图申请我的案例,但不幸的是没有成功,有人可以帮助我,也许可以解释一下请问解决方案?谢谢!
解决方案
你的数组不是同质的,这并不意味着它不能被输入,但如果你想接近条件 key_name 是第一个属性的名称,那就更难了。尝试这个:
type TObj<T extends string> = Record<T, number> & Record<"key_name", T>;
const testArray: [TObj<"a">, TObj<"b">, TObj<"c">] = [
{
a: 1,
key_name: 'a',
},
{
b: 2,
key_name: 'b',
},
{
c: 3,
key_name: 'c'
}
];
testArray.filter(obj => obj.key_name === "a);
但这并不能解决任何问题,对于 testFn 你应该使用TObject<any>
所以对于这个问题,是不可能的。
推荐阅读
- php - 使用 MailGun API - Yii2 中的批量发送
- php - 有或没有服务容器的链式过滤器的实例化
- linux - linux如何拦截未经授权的进程访问文件,使用FUSE(cryfs或gocryptfs)
- android - App Actions 是否支持其他非英语语言环境
- mongodb - MongoDB:根据条件从文档列表中选择文档
- c++ - 将对象移动到 unique_ptr
- mysql - SQL查询以查找员工的报告员
- python - Discord 频道会员只返回一名会员?
- javascript - 为什么这个标签在 sendgrid 内的 html 标签内不起作用?
- node.js - Nodejs AsyncLocalStorage getStore() 返回未定义