【问题标题】:Elegant way to achieve this with a generic type in key用 key 中的泛型类型来实现这一点的优雅方式
【发布时间】:2021-11-15 21:46:38
【问题描述】:

我编写了一个代码来过滤对象的任何字段,无论通过创建泛型类型接收到的类型如何,但我没有在 typescript 中找到一种优雅的方法,还有其他方法吗?

type Test = {
  id: number;
  name: string;
  actived: boolean;
}

const dd: Array<Test> = [
  {id: 2, name: "sss", actived: true},
  {id: 3, name: "tt", actived: false},
  {id: 4, name: "mmmmm", actived: true},
  {id: 5, name: "tttt", actived: true}
]
const run = <T, K extends keyof T>(datas: Array<T>, key: K) => {
  return datas.filter(data => castTForFilter(data[key]))
}

const castTForFilter = <K,v = null>(key: K): boolean => {
  switch(typeof key) {
    case "string":
      return key.includes("tt")
    case "number":
      return key == 2
    case "boolean":
      return key == true
    default:
      return false
  }
}

console.log(run(dd, "name"))
console.log(run(dd, "id"))
console.log(run(dd, "actived"))

【问题讨论】:

  • 您能更好地解释一下您要做什么吗?代码有点混乱。 run 是否缺少过滤器值的参数?另外,castTForFilter key 实际上接收的是值,而不是键(data[key] 是值)。
  • 你可以 curry castTForFilter,参见示例 tsplay.dev/m3z9LN 。它对你有用吗?
  • 是的,它是一个值,代码可以过滤对象键而不是执行 data.name 或 data.id 我制作了一个代码,您只需将对象数组和键作为参数传递给它然后,如果键是字符串,我可以使用字符串函数进行比较,如果它是数字函数,那么我在 switch case 中键入键,我想要一种优雅的方式来做到这一点例如:字符串键:我们可以include,chartAt 等... number 类型的键:我们可以 toString 等..
  • 请提供更好的方法来回答的预期结果

标签: typescript object types


【解决方案1】:

@captain-yossarian 你的代码或多或少比我的优雅,但我希望用类型解决这个问题而不是 typecript 提供的,但没关系。

你的代码:

type Test = {
    id: number;
    name: string;
    actived: boolean;
}
const customData: Test[] = [
    { id: 2, name: "sss", actived: true },
    { id: 3, name: "tt", actived: false },
    { id: 4, name: "mmmmm", actived: true },
    { id: 5, name: "tttt", actived: true }
]

const run = <
    Elem extends Test,
    Data extends Elem[],
    >(data: [...Data], cb: (elem: Elem) => boolean) => data.filter(cb)



const castTForFilter = <Key extends keyof Test>(key: Key) =>
    <Elem extends Test>(elem: Elem) => {
        const value = elem[key]
        switch (typeof value) {
            case "string":
                return value.includes("tt")
            case "number":
                return value == 2
            case "boolean":
                return value == true
            default:
                return false
        }
    }


const result = run(customData, castTForFilter('id'))
console.log(result)

【讨论】:

    猜你喜欢
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-05
    • 1970-01-01
    相关资源
    最近更新 更多