首页 > 解决方案 > 如何创建一个接受对象并返回修改版本的类型?

问题描述

我需要键入一个接受对象并返回修改后的对象的函数,如下所示:


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键下。

标签: typescript

解决方案


这是一个相对简单的映射类型

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

看起来像你想要的。

Playground 代码链接


推荐阅读