TypeScript中如何根据参数推断函数的对应返回类型?
解决TypeScript函数返回类型无法根据参数自动推断的问题
你遇到的核心问题是TypeScript默认不会将zoneType参数的类型窄化结果与函数返回类型做关联,导致返回值始终是所有分支类型的联合。以下是两种简洁的解决方法:
方法一:泛型+类型映射(推荐)
先建立zoneType与对应返回类型的映射关系,再通过泛型让TypeScript自动推断返回类型:
- 首先补充
ZoneZoneType的枚举定义(你代码中未给出,示例如下):
enum ZoneZoneType { Type1 = "Type1", Type2 = "Type2", Type3 = "Type3", Type4 = "Type4" }
- 定义类型映射,明确每个
zoneType对应的返回GeoJSON类型:
// 按实际业务调整每个Type对应的返回类型 type ZoneTypeToGeojson = { [ZoneZoneType.Type1]: MyType1; [ZoneZoneType.Type2]: MyType1; [ZoneZoneType.Type3]: MyType1; // 若Zone2实际返回MyType2,此处改为MyType2 [ZoneZoneType.Type4]: MyType1; // 若Zone3实际返回MyType3,此处改为MyType3 };
- 修改
exportZone为泛型函数:
export const exportZone = <T extends ZoneZoneType>( zoneType: T, zone: FeatureCollection<Polygon>, ): ZoneTypeToGeojson[T] => { switch (zoneType) { case ZoneZoneType.Type1: case ZoneZoneType.Type2: return zone1.zoneGeojsonFactory.exportZoneEdition(zone) as ZoneTypeToGeojson[T]; case ZoneZoneType.Type3: return zone2.zoneGeojsonFactory.exportZoneEdition(zone) as ZoneTypeToGeojson[T]; case ZoneZoneType.Type4: return zone3.zoneGeojsonFactory.exportZoneEdition(zone) as ZoneTypeToGeojson[T]; default: throw new Error(`Unknown zone type ${zoneType ?? '[undefined]'}`); } };
调用时,TypeScript会根据传入的zoneType自动推断出对应返回类型:
const type1Res = exportZone(ZoneZoneType.Type1, someZone); // type1Res类型为MyType1 const type3Res = exportZone(ZoneZoneType.Type3, someZone); // type3Res类型为MyType1(若映射修改则对应变更)
方法二:函数重载
函数重载并非“重复函数”,而是通过多个签名定义参数与返回值的对应关系,再用一个实现签名处理逻辑:
// 重载签名:定义不同参数对应的返回类型 export function exportZone(zoneType: ZoneZoneType.Type1 | ZoneZoneType.Type2, zone: FeatureCollection<Polygon>): MyType1; export function exportZone(zoneType: ZoneZoneType.Type3, zone: FeatureCollection<Polygon>): MyType1; // 按实际返回类型调整 export function exportZone(zoneType: ZoneZoneType.Type4, zone: FeatureCollection<Polygon>): MyType1; // 按实际返回类型调整 // 实现签名:处理具体逻辑,返回类型为联合类型即可 export function exportZone( zoneType: ZoneZoneType, zone: FeatureCollection<Polygon>, ): ZoneGeojson { switch (zoneType) { case ZoneZoneType.Type1: case ZoneZoneType.Type2: return zone1.zoneGeojsonFactory.exportZoneEdition(zone); case ZoneZoneType.Type3: return zone2.zoneGeojsonFactory.exportZoneEdition(zone); case ZoneZoneType.Type4: return zone3.zoneGeojsonFactory.exportZoneEdition(zone); default: throw new Error(`Unknown zone type ${zoneType ?? '[undefined]'}`); } }
调用时同样会得到精确的返回类型,无需额外断言。
内容的提问来源于stack exchange,提问作者Erwan
相关产品推荐
相关产品推荐

