【问题标题】:Typescript - Limit keyof to stringsTypescript - 将 keyof 限制为字符串
【发布时间】:2021-11-21 06:40:01
【问题描述】:

我正在尝试创建一个过滤器挂钩,我希望挂钩的参数是数据数组、要过滤的道具 (filterProp) 和搜索文本。

所以我希望数据是 T[],filterProp 是一个字符串,表示 T 的键之一,但只有字符串值(所以我可以在过滤中对它们执行“toUpper”和“indexOf”。搜索文本只是一个字符串。

所以我尝试了这样的事情::

export const useFilter = <T, K extends Extract<keyof T,string>>(
  data: T[] | undefined,
  filterProp: K,
  searchText: string
) => {

但是当我尝试用它“toUppercase”时:

data?.filter((item) => item[filterProp].toUpperCase().indexOf(searchText.toUpperCase()) > -1) ?? [];

它提出了 toUppercase 在类型 'T[K]' 上不存在。

有人知道我如何将 filterProp 限制为代表 T 的字符串键之一的字符串值吗?

谢谢

【问题讨论】:

  • 你的T和K的接口(类型)是什么?您可以将其添加到您的问题中吗?
  • @novonimo 嗯,它不应该真的有什么区别,因为我需要它来处理 T 的所有接口。我当前的接口是:interface Item { id: number; name: string; amount: number; image: Image; } 我只需要它建议名称为filterprop 的选项(因为它是唯一的字符串),当我从 T 对象 item[filterProp] 中提取指定的道具时,我需要 toUpper 才能正常工作

标签: reactjs typescript generics react-hooks


【解决方案1】:

你可以限制T 拥有K 属性和string 值:

export const useFilter = <T extends Record<K, string>, K extends PropertyKey>(...

Playground


实用工具链接:Record<Keys, Type>PropertyKey

【讨论】:

  • 非常感谢 :) 这行得通,只是它不能帮助我将 filterProp 的选项限制为 T 的字符串类型属性。我可以在这里在 filterProp 中写任何字符串 - 我'我喜欢它推断我可以使用 T 的所有字符串键,但不能使用其他键。这有意义吗?
  • @DanielOlsen 这不是您所描述的吗?也许我错过了什么typescriptlang.org/play?#code/…
  • 你说得对——我以前有一个案例,我可以指定 keyof T 并且“智能感知”会给我所有选项,所以我可以在它们之间进行选择。但这并没有做到这一点,但我想这可能是不可能的。您的解决方案虽然有效,但如果我尝试使用非字符串,我会收到错误 - 太好了 - 谢谢 :)
猜你喜欢
  • 1970-01-01
  • 2021-05-21
  • 2018-04-25
  • 2021-09-22
  • 1970-01-01
  • 2020-12-26
  • 1970-01-01
  • 1970-01-01
  • 2022-11-30
相关资源
最近更新 更多