typescript - 如何创建一个接受对象并返回修改版本的类型?
问题描述
我需要键入一个接受对象并返回修改后的对象的函数,如下所示:
const data = {
email: 'john@doe.com',
}
// This type is where I have trouble
type WrappedInput<T, K extends keyof T> = { [key: K]: { set: T[K] } }
function toInput<T = unknown>(data: T): WrappedInput<T> {
return {
email: {
set: data.email
}
}
}
每个键都应该包裹在一个set
键下。
解决方案
这是一个相对简单的映射类型:
type WrappedInput<T> = { [K in keyof T]: { set: T[K] } }
注意in
类型定义中的操作符,表明这是一个映射类型而不是字符串索引签名。上面的映射类型遍历键K
联合中的所有键keyof T
并单独对它们进行操作。
那么您的实现可能如下所示:
function toInput<T>(data: T): WrappedInput<T> {
return Object.fromEntries(
Object.entries(data).map(([k, v]) => [k, { set: v }])
) as any;
}
(假设您的环境有Object.fromEntries()
和Object.entries()
)。
我们可以测试它:
const inputData = toInput(data);
console.log(inputData.email.set.toUpperCase()) // JOHN@DOE.COM
看起来像你想要的。
推荐阅读
- python - python venv 可以与 plpython3u 一起用于 postgresql 吗?
- java - Spark 流式传输:由于 java.lang.NullPointerException,运行作业流式传输作业时出错
- javascript - js如何将其(10000000000000000000000000000)长度计算为5?
- ios - Safari 或 IOS 中视频的 aws-sdk getSignedUrl 不起作用
- windows - Windows 命令在 cmd 但不是 .bat 文件中工作
- kubernetes - Traefik + Keycloak Gatekeeper Websocket 认证
- c# - 如何在不接触磁盘的情况下将 assembly.load(byte[]) 托管的 dll 加载到内存中
- c++ - 有没有办法制定一个也可以检测高原的峰值发现函数?
- python - Python np.select 将某些条件匹配到多项选择
- c# - 编写自己的 json 属性的最佳实践,该属性将被 json.net 反序列化忽略