You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过泛型实现基于外部对象的可复用TypeScript类型生成?

基于传入对象生成自定义TypeScript类型的复用方案

问题背景

编写TypeScript Hook时,需要根据外部传入的对象生成特定结构的自定义类型:每个键对应的值为key_keyof Object[key]的联合类型。目前已能针对单个对象实现类型转换,但希望通过泛型或函数实现逻辑复用,避免重复编写代码。

示例

输入对象:

const demoObj = {
  test: {
    '1': '',
    '2': ''
  },
  test1: {
    '3': '',
    '4': ''
  }
}

期望生成的类型:

type ExpectedType = {
  'test': 'test_1' | 'test_2',
  'test1': 'test1_3' | 'test1_4'
}

当前实现(仅针对特定对象)

type Keys = keyof typeof demoObj
type Values = { [key in Keys]: keyof typeof demoObj[key] }
type ExpectedType = { [key in keyof Values]: `${key}_${Values[key]}` }

解决方案:泛型封装类型逻辑

可以通过泛型类型直接封装转换逻辑,实现对任意符合结构的对象的类型复用:

1. 定义泛型类型

type GenerateKeyCombinedType<T extends Record<string, Record<string, any>>> = {
  [K in keyof T]: `${K & string}_${keyof T[K] & string}`
}
  • 泛型约束T extends Record<string, Record<string, any>>确保传入的对象是“键对应嵌套对象”的结构
  • K & string和keyof T[K] & string用于确保模板字符串类型能正确拼接(TypeScript需要明确类型为字符串)

2. 泛型类型的使用

直接将目标对象的类型传入泛型即可:

// 针对示例对象生成目标类型
type DemoResult = GenerateKeyCombinedType<typeof demoObj>
// DemoResult的结构与ExpectedType完全一致

3. 结合函数实现类型推断(可选)

如果需要在函数中自动推断传入对象的类型并返回对应类型,可以创建辅助函数:

function getKeyCombinedType<T extends Record<string, Record<string, any>>>(obj: T): GenerateKeyCombinedType<T> {
  // 可根据需求实现运行时逻辑,比如生成对应的值集合
  return Object.fromEntries(
    Object.entries(obj).map(([key, nestedObj]) => [
      key,
      Object.keys(nestedObj).map(nestedKey => `${key}_${nestedKey}`) as any
    ])
  ) as GenerateKeyCombinedType<T>
}

// 使用示例
const result = getKeyCombinedType(demoObj)
// result的类型自动推断为GenerateKeyCombinedType<typeof demoObj>

内容的提问来源于stack exchange,提问作者Nick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 22:15:30