TypeScript泛型可选函数参数的返回类型适配问题
解决TypeScript工厂函数可选参数的返回类型匹配问题
要实现让sk成为可选参数,且返回类型根据是否传入sk动态变化,可以通过两种方式实现:
方案一:函数重载(推荐,可读性更强)
通过定义重载签名明确不同调用场景的类型映射:
// 重载签名1:仅传入pk参数 function index<PK extends string>(pk: PK): { pk: PK }; // 重载签名2:同时传入pk和sk参数 function index<PK extends string, SK extends string>(pk: PK, sk: SK): { pk: PK, sk: SK }; // 函数实现逻辑 function index<PK extends string, SK extends string | undefined>(pk: PK, sk?: SK) { return sk !== undefined ? { pk, sk } : { pk }; } // 测试验证 const i1 = index("pk1"); // 类型推导为 { pk: "pk1" } const i2 = index("pk1", "sk1"); // 类型推导为 { pk: "pk1", sk: "sk1" }
原理说明
- 重载签名直接对应两种调用场景,让TypeScript能精准推导返回类型;
- 实现签名兼容
sk可选的情况,内部通过判断参数是否存在返回对应结构。
方案二:泛型条件类型(单函数实现)
利用默认泛型参数和条件类型动态判断返回类型:
const index = <PK extends string, SK extends string | undefined = undefined>( pk: PK, sk?: SK ): SK extends undefined ? { pk: PK } : { pk: PK, sk: SK } => { return (sk !== undefined ? { pk, sk } : { pk }) as any; }; // 测试验证 const i1 = index("pk1"); // 类型为 { pk: "pk1" } const i2 = index("pk1", "sk1"); // 类型为 { pk: "pk1", sk: "sk1" }
原理说明
- 通过默认泛型参数
SK = undefined处理未传sk的情况; - 条件类型
SK extends undefined ? ... : ...根据参数是否存在返回对应类型; - 需用
as any做类型断言,因为TypeScript无法自动推导条件类型的返回值匹配。
内容的提问来源于stack exchange,提问作者florian norbert bepunkt
相关产品推荐
相关产品推荐

