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

Typescript中如何实现interface的key与其关联值的类型匹配

解决方案

你可以通过以下三种常用方式实现类型收窄,满足你的需求:

1. 函数重载(最推荐,兼容性最好)

通过定义明确的重载签名,TypeScript会自动在分支中匹配对应类型:

enum Enum1 {
  ENUM_1_KEY_1 = 'ENUM_1_KEY_1',
  ENUM_1_KEY_2 = 'ENUM_1_KEY_2',
}

enum Enum2 {
  ENUM_2_KEY_1 = 'ENUM_2_KEY_1',
  ENUM_2_KEY_2 = 'ENUM_2_KEY_2',
}

interface EnumNamespace {
  enum1: Enum1[]
  enum2: Enum2[]
}

// 定义重载签名
function func(key: 'enum1', type: Enum1[]): void
function func(key: 'enum2', type: Enum2[]): void
// 实现签名
function func(key: keyof EnumNamespace, type: Enum1[] | Enum2[]) {
  if (key === 'enum1') {
    // 此处type自动被推断为Enum1[]
    console.log(type)
  } else {
    // 此处type自动被推断为Enum2[]
    console.log(type)
  }
}

2. 元组联合参数(适合TS 4.6+版本)

将函数入参定义为联合元组,分支判断后自动收窄类型:

type FuncParams = 
  | [key: 'enum1', type: Enum1[]]
  | [key: 'enum2', type: Enum2[]]

function func(...args: FuncParams) {
  if (args[0] === 'enum1') {
    const [, type] = args
    // type 类型为 Enum1[]
  } else {
    const [, type] = args
    // type 类型为 Enum2[]
  }
}

3. 分支内直接类型断言(临时使用最简方案)

如果只需要在个别分支使用对应类型,可以直接手动断言:

function func<K extends keyof EnumNamespace>(key: K, type: EnumNamespace[K]) {
  if (key === 'enum1') {
    const enum1Type = type as Enum1[]
    // 直接使用enum1Type即可
  } else {
    const enum2Type = type as Enum2[]
    // 直接使用enum2Type即可
  }
}

内容的提问来源于stack exchange,提问作者André Krosby

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 12:36:00