TypeScrip:创建具有相同键但不同值的对象 [英] Typescript: Create object with same keys but different values

查看:0
本文介绍了TypeScrip:创建具有相同键但不同值的对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下初始对象

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

推荐答案

我会这样写:

    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);

由于REDUTE()调用,我看不到没有强制转换的选项。(从部分或从任何。)请注意,对象条目()要求downlevelIterationts编译器选项为真(https://www.typescriptlang.org/docs/handbook/compiler-options.html)。

这篇关于TypeScrip:创建具有相同键但不同值的对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆