如何在TypeScript中定义实现字段互换的swap函数?
解决方法
你可以通过函数重载或者泛型+条件类型两种方式实现需求,既能保证输入输出的精确类型映射,又不会出现代码重复。
方法一:函数重载
保留精确的重载签名,实现逻辑只写一次即可,TypeScript会自动根据输入类型匹配对应的返回类型:
type Foo = { a: string; b: number }; type Bar = { a: number; b: string }; type FooBar = Foo | Bar; // 重载签名:明确输入输出的类型对应关系 function swap({ a, b }: Foo): Bar; function swap({ a, b }: Bar): Foo; // 实现签名:仅需编写一次核心逻辑 function swap({ a, b }: FooBar): FooBar { return { a: b, b: a }; } // 测试示例:类型推导完全正确 const foo: Foo = { a: "hello", b: 123 }; const bar = swap(foo); // bar 类型自动推导为 Bar const foo2 = swap(bar); // foo2 类型自动推导为 Foo
这种方式直观清晰,重载签名明确了每种输入对应的输出类型,核心逻辑无重复。
方法二:泛型+条件类型
用泛型结合条件类型,让TypeScript自动根据输入类型推断返回类型,写法更简洁:
type Foo = { a: string; b: number }; type Bar = { a: number; b: string }; // 定义条件类型,实现输入到输出的类型映射 type SwapType<T> = T extends Foo ? Bar : T extends Bar ? Foo : never; function swap<T extends Foo | Bar>({ a, b }: T): SwapType<T> { return { a: b, b: a } as SwapType<T>; } // 测试示例:类型推导同样精准 const foo: Foo = { a: "test", b: 456 }; const bar = swap(foo); // bar 类型为 Bar const foo2 = swap(bar); // foo2 类型为 Foo
这里的SwapType会判断输入泛型T的类型,自动映射为对应的目标类型。类型断言as SwapType<T>是为了告诉TypeScript返回值符合映射后的类型(TypeScript无法自动推断这种交叉类型的互换逻辑)。
两种方法都能满足你的需求,既保证了类型精确性,又避免了代码重复。
内容的提问来源于stack exchange,提问作者lzl124631x
相关产品推荐
相关产品推荐

