在 TypeScript 中的泛型约束中使用类型参数

问题描述 投票:0回答:1

我在很多地方都有以下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

typescript constraints typescript-generics
1个回答
0
投票

在您的

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

© www.soinside.com 2019 - 2024. All rights reserved.