如何让TypeScript根据valueType参数推导返回类型而非使用重载?
让TypeScript根据valueType参数推导返回类型(无需函数重载)
当然可以,你完全可以通过类型映射+泛型约束的方式实现,不用依赖函数重载。核心思路是给valueType和返回类型建立明确的对应关系,让TypeScript能自动根据传入的参数值推导返回值类型。
具体实现
- 先定义一个泛型类型映射,把每个
valueType对应的返回类型明确下来:
// 定义valueType到返回类型的映射,依赖输入值的类型S type ValueTypeMap<S> = { integer: number; number: number; date: Date | undefined; dateTime: Date | undefined; string: string; boolean: boolean; "": S; // 空字符串对应返回原输入类型 }; // 从映射中提取合法的valueType取值,避免重复定义联合类型 type ValueType = keyof ValueTypeMap<any>;
- 重构函数,用泛型关联输入值类型和
valueType,直接通过映射推导返回类型:
function toValueType<S, T extends ValueType>( v: S, valueType: T ): ValueTypeMap<S>[T] { switch (valueType) { case "integer": return To.int(v) as ValueTypeMap<S>[T]; case "number": return To.number(v) as ValueTypeMap<S>[T]; case "date": return To.date(v) as ValueTypeMap<S>[T]; case "dateTime": return To.dateTime(v) as ValueTypeMap<S>[T]; case "string": return To.string(v) as ValueTypeMap<S>[T]; case "boolean": return To.boolean(v) as ValueTypeMap<S>[T]; default: return v as ValueTypeMap<S>[T]; } }
关键说明
- 类型映射
ValueTypeMap<S>把每个valueType和对应返回类型绑定,空字符串对应的是输入值的原始类型S。 - 函数返回类型直接取
ValueTypeMap<S>[T],TypeScript会根据传入的T(即valueType的具体值)自动匹配对应的返回类型。 - 每个
case里的as断言是因为TypeScript的switch语句暂时无法自动关联泛型映射的类型,这是一个不影响功能的小补充。
调用示例
这样调用时,TypeScript能准确推导返回类型:
const intResult = toValueType("123", "integer"); // intResult类型为number const strResult = toValueType(456, "string"); // strResult类型为string const originalVal = toValueType("hello", ""); // originalVal类型为string const dateResult = toValueType("2024-05-20", "date"); // dateResult类型为Date | undefined
内容的提问来源于stack exchange,提问作者Ahmed Albahrawy
相关产品推荐
相关产品推荐

