gpt4 book ai didi

javascript - typescript 中具有通用键的对象

转载 作者:行者123 更新时间:2023-12-01 16:18:25 24 4
gpt4 key购买 nike

我想创建一个通用函数,它将接受一个对象,然后进行一些转换并返回具有相同键和不同值的新对象。我正在尝试使其成为“强类型”,因此使用它的每个人都将受益于 TS 和不存在的 key 应该抛出一个错误。

我现在拥有的:

const hash = {
"first": 1,
"second": 2,
"third": 3,
}

type Mapper<T> = {
[key in keyof T]: number
}

type Result<T>= {
[key in keyof T]: () => number
}

const transform = <T>(mapper: Mapper<T>) => {
const result = {} as Result<T>

(Object.keys(mapper) as (keyof T)[]).map(key => {
result[key] = () => mapper[key]
})

return result
}

type Hash = typeof hash

const a = transform<Hash>(hash)

a.first()
// a.fifth() OK error

它运作良好,但我正在寻找解决此问题的解决方案:
  • 删除类型断言 const result = {} as Result<T>
  • 删除类型断言 (Object.keys(mapper) as (keyof T)[]) (或使用 Object.entries ,但在这种情况下似乎也需要类型断言)

  • 我可以在 Typescript 中以更“干净”的方式实现相同的功能吗?

    最佳答案

    Object.keys返回 总是 string[]因此,您将需要铸件。
    更小更强大的版本将使用 reduce .
    另一个小的改进是使用原始 key 的类型,T[Key] .

    const hash = {
    "first": 'someString',
    "second": 2,
    "third": 3,
    }

    type Result<T>= {
    [Key in keyof T]: () => T[Key]
    }

    const transform = <T extends object>(obj: T): Result<T> => {
    return (Object.keys(obj) as Array<keyof T>).reduce((result, key) => {
    result[key] = () => obj[key];
    return result;
    }, {} as Result<T>)
    }

    const a = transform(hash)

    a.first() // returns "string"
    a.second() // return "number"

    关于javascript - typescript 中具有通用键的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59545011/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com