You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 21:42:27