如何在TypeScript实现时解析TypeWithDynamicValue的value联合类型
如何让TypeScript类型的value字段自动推导为具体类型(无需泛型/satisfies)
问题背景
我定义了一个TypeWithDynamicValue类型,其中value字段限制为string | boolean | number联合类型。但在声明实现时,希望value的类型能自动解析为具体类型(比如传入数字就推导为number),且不需要开发者手动指定泛型或使用satisfies关键字。
当前直接使用类型注解的问题:
type TypeWithDynamicValue = { foo: string; bar: boolean; value: string | boolean | number; } const implementation: TypeWithDynamicValue = { foo: 'fizz', bar: false, value: 59 }; type ValueTypeResult = typeof implementation.value; // 结果仍是 string | boolean | number,而非预期的 number
现有方案的局限
曾尝试将类型拆分为交叉联合的形式,配合泛型函数推导具体类型,在同一文件内有效,但跨文件导入实现时会失效——因为TypeScript在同一文件内会应用控制流分析后的类型,而跨文件时只会使用类型注解中声明的原始联合类型。
可行解决方案:利用infer工具类型+泛型辅助函数
通过泛型辅助函数来包裹实现的创建过程,结合infer提取具体类型,能解决跨文件类型推导失效的问题,同时满足无需手动指定泛型或satisfies的需求。
类型定义与辅助函数(types.ts)
// 定义基础公共结构 type BaseType = { foo: string; bar: boolean; }; // 原目标类型 export type TypeWithDynamicValue = BaseType & { value: string | number | boolean; }; // 工具类型:从TypeWithDynamicValue中提取value的具体类型 type ExtractValue<T extends TypeWithDynamicValue> = T extends BaseType & { value: infer V } ? V : never; // 泛型辅助函数:自动推导传入对象的具体类型 export function createImplementation<T extends TypeWithDynamicValue>(impl: T): T { return impl; }
跨文件使用示例(other-file.ts)
import { createImplementation } from './types'; // 无需手动指定泛型或使用satisfies,自动推导类型 const implementation = createImplementation({ foo: 'fizz', bar: false, value: 59 }); type ValueTypeResult = typeof implementation.value; // 结果为 number,符合预期
原理说明
泛型辅助函数createImplementation会在调用时自动推导传入对象的完整具体类型,即使跨文件导入,TypeScript也会保留这个推导后的类型信息,而非回退到原始的联合类型。infer工具类型则可以精准提取出value字段的具体类型,满足类型推导的需求。
内容的提问来源于stack exchange,提问作者yroc
相关产品推荐
相关产品推荐

