如何让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
相关产品推荐
相关产品推荐

