打字稿:创建具有相同键但不同值的对象
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
。当前版本在操场上工作,答案中有一个链接。以上是关于打字稿:创建具有相同键但不同值的对象的主要内容,如果未能解决你的问题,请参考以下文章