【问题标题】:Typescript: Create object with same keys but different values打字稿:创建具有相同键但不同值的对象
【发布时间】:2019-09-29 03:13:04
【问题描述】:

我有以下初始对象

const initialValues = { name: 'Jon', email: 'jon@me.com' }

我想创建一个相同的对象,除了所有值都是boolean 并且默认为false。像这样

const expected = { name: false, email: false }

我创建了以下函数,它可以满足我的需求

const expected = cloneWithDefaults<typeof initialValues>(initialValues)

function cloneWithDefaults<T>(values: T) {
  type U = { [K in keyof T]: boolean }
  const keys = Object.keys(values) as Array<keyof T>
  const partial: Partial<U> = keys.reduce<Partial<U>>((acc, cur) => {
    acc[cur] = false
    return acc
  }, {})
  const final = partial as U
  return final
}

我还创建了不使用 reduce 的第二个版本

function createCloneWithDefaultsV2<T extends { [key: string]: unknown }>(values: T) {
  type U = { [K in keyof T]: boolean }
  const keys = Object.keys(values) as Array<keyof U>
  const partial: Partial<U> = {}
  for (let k in keys) {
    partial[k] = false
  }
  const final = partial as U
  return final
}

我想知道是否有更好/更简洁的方法来做到这一点。特别是如果可能的话,我想摆脱as 的两种用途。

在 v2 中,我想知道与 any 相比,unknown 是否有任何偏好。

【问题讨论】:

  • unknown 有什么问题?您没有在函数中使用值,并且似乎不需要以任何方式限制值的类型。所以如果你想在这个地方接受任何类型,任何和未知都应该在这里。 (afaik 这里没有区别,因为您不访问该值)
  • 我可以使用 any 而不是 unknown 只是想知道在这种情况下是否有偏好。

标签: typescript typescript-typings


【解决方案1】:

我会这样写:

    function cloneWithDefaults<T>(values: T) {
        return <{[key in keyof T]: boolean}> Object.entries(values).reduce((p, [k, v]) => Object.assign(p, { [k]: false }), {});
    }
    const initialValues = { name: 'Jon', email: 'jon@me.com' };
    const expected = cloneWithDefaults(initialValues);

由于 reduce() 调用,我看不到没有强制转换的选项。 (来自部分或任何。)请注意,Object.entries() 要求 downlevelIteration ts 编译器选项为真 (https://www.typescriptlang.org/docs/handbook/compiler-options.html)。

【讨论】:

    【解决方案2】:

    这是基于 Christoph 的回答的another alternative

    const cloneWithDefaultValues = <T>(input: T) => Object
        .keys(input)
        .reduce(
            (clone, key) => ({ [key]: false, ...clone }),
            {} as Record<keyof T, boolean>
        );
    

    【讨论】:

    • 还需要一个最终的as {[key in keyof T]: boolean}
    • @david_adler 为什么我们需要一个最终的as {[key in keyof T]: boolean}。当前版本在操场上工作,答案中有一个链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-12
    • 1970-01-01
    • 2011-08-19
    相关资源
    最近更新 更多