打字稿:创建具有相同键但不同值的对象

Posted

技术标签:

【中文标题】打字稿:创建具有相同键但不同值的对象【英文标题】: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 只是想知道在这种情况下是否有偏好。 未知与任何:***.com/questions/51439843/unknown-vs-any 【参考方案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。当前版本在操场上工作,答案中有一个链接。

以上是关于打字稿:创建具有相同键但不同值的对象的主要内容,如果未能解决你的问题,请参考以下文章

具有定义值的打字稿动态对象键

具有命名属性和不同类型的任意命名索引属性的打字稿接口[重复]

如何使用打字稿定义一个对象以具有不同的字段?

具有默认值的打字稿固定数组

具有基于变量的标签值的打字稿匿名对象

使用Jackson在android中反序列化具有相同键但不同类型的json