由网友(伤心又怎样。)分享简介:我有以下初始对象const initialValues = { name: 'Jon', email: 'jon@me.com' }我想创建一个相同的对象,除非所有值都是boolean并且默认为false。就像这样const expected = { name: false, email: false }我创建了以下函...![解析大型互联网应用系统架构](https://p.xsw88.cn/allimgs/daicuo/20230903/2525.png)
我有以下初始对象
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
}
![解析大型互联网应用系统架构](https://p.xsw88.cn/allimgs/daicuo/20230903/2525.png)
我还创建了第二个版本,该版本不使用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()调用,我看不到没有强制转换的选项。(从部分或从任何。)请注意,对象条目()要求downlevelIteration
ts编译器选项为真(https://www.typescriptlang.org/docs/handbook/compiler-options.html)。
相关推荐
最新文章