如何让TypeScript自动推断FormatEntry泛型参数,无需手动指定?
解决TypeScript泛型自动推断问题:属性名与回调参数类型匹配
你遇到的问题核心在于:变量的类型注解位置无法自动推断泛型参数。你定义的FormatEntry<K>是泛型类型,但TypeScript不会从变量的初始化值反向推导这个泛型参数,必须显式传入,这就是报错的原因。
下面提供两种无需重复指定类型的解决方案:
方案一:将FormatEntry定义为联合类型
直接生成覆盖所有属性的联合类型,让TypeScript自动匹配accessor对应的formatter参数类型:
type Obj = { i: number b: boolean s: string } // 生成每个属性对应的FormatEntry结构,再合并为联合类型 type FormatEntry = { [K in keyof Obj]: { accessor: K, formatter: (value: Obj[K]) => string } }[keyof Obj] // 直接使用,无需手动指定类型 const a: FormatEntry = { accessor: 'b', formatter: (value) => value ? 'a' : 'b' // value自动推断为boolean } const b: FormatEntry = { accessor: 'i', formatter: (value) => value.toString() // value自动推断为number }
方案二:用泛型函数辅助推断
利用函数泛型参数可自动推断的特性,创建工厂函数生成符合要求的对象:
type Obj = { i: number b: boolean s: string } type FormatEntry<K extends keyof Obj> = { accessor: K, formatter: (value: Obj[K]) => string } // 泛型工厂函数,自动推断K的类型 function createFormatEntry<K extends keyof Obj>(entry: FormatEntry<K>) { return entry } // 使用时无需手动指定泛型参数 const a = createFormatEntry({ accessor: 'b', formatter: (value) => value ? 'a' : 'b' // value自动推断为boolean }) const c = createFormatEntry({ accessor: 's', formatter: (value) => value.toUpperCase() // value自动推断为string })
原写法失效的原因
TypeScript中,变量的类型注解(比如const a: FormatEntry)要求泛型类型必须显式传入参数——它不会像函数那样,从传入的参数反向推断泛型类型。所以要么手动指定FormatEntry<'b'>,要么改用上述两种让TypeScript自动处理类型的方式。
内容的提问来源于stack exchange,提问作者skyboyer
相关产品推荐
相关产品推荐

