我在很多地方都有以下ts代码:
(注意这里有一个 typescript 游乐场 以及示例)
let filtered = items.filter(item =>
item.title.toLowerCase().includes(search.toLowerCase()) ||
item.name.toLowerCase().includes(search.toLowerCase()) ||
item.date.toLowerCase().includes(search.toLowerCase())
);
所以我创建了这个函数
function filterByKey<T, K extends keyof T>(items: T[], keys: K[], search: string) {
return items.filter((item) =>
keys.some((key) => item[key].toString().toLowerCase().includes(search.toLowerCase()))
);
}
这样称呼它:
let filtered = filterByKey(items, ['title', 'name', 'date'], search));
但我收到此错误:
Property 'toString' does not exist on type 'T[K]'
我尝试了这样的方法,但它似乎不是有效的语法
function filterByKey<T, K extends keyof T, T[K] extends string>(items: T[], keys: K[], search: string)
如何告诉ts物品的属性将支持
.toString()
或者你会如何处理这种情况,这样打字稿就不会抱怨?
我检查了这个 ts 文档:https://www.typescriptlang.org/docs/handbook/2/generics.html#using-type-parameters-in-generic-constraints
在您的
filterByKey
函数中,TypeScript 不知道 T[K]
可能是什么类型,因此它将被视为 unknown
,因此 T[K]
的任何方法或属性都不会被视为有效。
这里缺少的是对
T
类型的约束,以指示 T
的任何键都将是 string
类型
类似这样的:
function filterByKey<T extends Record<string, string>, K extends keyof T>(items : T[], keys : K[], search : string) {
这样,
T[K]
将是string
类型,并且toLowerCase
将是有效的(不需要使用toString
)