如何在TypeScript中实现输入类型与返回类型的映射?
解决输入类型到返回类型的映射问题
要让TypeScript根据输入的具体类型自动推断对应的返回类型,你可以通过类型映射+条件类型或者函数重载两种方式实现,下面分别给出方案:
方案一:类型映射 + 条件类型
先定义输入类型到返回类型的映射关系,再通过条件类型关联输入与返回类型,配合类型守卫完成自动推断:
class P1 { i = 0; } class P2 { s = ''; } class R1 { public foo() {} } class R2 { public bar() {} } // 定义输入到输出的类型映射关系 type InputToOutput = { P1: R1; P2: R2; }; // 用条件类型让返回类型随输入类型动态变化 function remap<T extends P1 | P2>(value: T): T extends P1 ? R1 : R2 { if (value instanceof P1) { return new R1() as T extends P1 ? R1 : R2; } else { return new R2() as T extends P1 ? R1 : R2; } } const v = remap(new P1); v.foo(); // 自动推断为R1类型,无报错 const v2 = remap(new P2); v2.bar(); // 自动推断为R2类型
这里的核心是通过T extends P1 ? R1 : R2条件类型,让TypeScript根据泛型T的具体类型返回对应结果;末尾的类型断言是为了让编译器识别分支返回值与条件类型的匹配关系。
方案二:函数重载
如果觉得条件类型不够直观,也可以直接用函数重载明确声明每个输入对应的返回类型:
class P1 { i = 0; } class P2 { s = ''; } class R1 { public foo() {} } class R2 { public bar() {} } // 重载签名:明确每个输入类型对应的返回类型 function remap(value: P1): R1; function remap(value: P2): R2; // 实现签名:编写实际逻辑处理代码 function remap(value: P1 | P2): R1 | R2 { if (value instanceof P1) { return new R1(); } else { return new R2(); } } const v = remap(new P1); v.foo(); // 自动推断为R1类型 const v2 = remap(new P2); v2.bar(); // 自动推断为R2类型
这种方式更直接,通过重载签名告知TypeScript不同输入对应的返回类型,调用函数时会自动匹配重载规则完成类型推断。
内容的提问来源于stack exchange,提问作者jayatubi
相关产品推荐
相关产品推荐

