【发布时间】: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