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

如何让TypeScript中T[K]继承指定类型?示例解析

泛型场景

在如下函数中:

const myFunction = <T, K extends keyof T>(obj: T, key: K): SpecificType => {
  const x: SpecificType = obj[key] // ❌ Type 'T[string]' is not assignable to type SpecificType
}

能否定义myFunction(obj, key)以确保obj[key] extends SpecificType?

示例

给定如下函数:

type KeysMatching<T, V> = {
  [K in keyof T]-?: T[K] extends V ? K : never
}[keyof T]

export const groupArrayBy = <
  T extends Record<string, unknown>,
  K extends KeysMatching<T, string | number | symbol>
>(
  array: T[],
  key: K
) => {
  return array.reduce((acc, item) => {
    const group = item[key]
    if (!acc[group]) {
      acc[group] = []
    }
    acc[group].push(item)
    return acc
  }, {} as Record<T[K], T[]>) // ❌ Type 'T[string]' is not assignable to type 'string | number | symbol'
}

TypeScript 对{} as Record<T[K], T[]>报错,认为T[K]是unknown(因T extends Record<string, unknown>),但实际T[K]应为string | number | symbol,因为K extends KeysMatching<T, string | number | symbol>。

实际调用时:

const t = [
  {
    valid: 'string',
    alsoValid: 1,
    group: 2,
    invalid: [],
    outroInvalid: {}
  }
]

groupArrayBy(t, 'valid') // ✅ 一切正常
groupArrayBy(t, 'invalid') // ❌ 不符合预期,报错

即便如此,TypeScript 仍无法识别:在任何合法的groupArrayBy([obj], key)调用中,obj[key]始终为string | number | symbol,本应兼容Record<T[K], T[]>。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 12:37:14