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

TypeScript如何实现根据参数类型返回对应类型的接口方法?

问题分析与解决方案

问题根源

你定义的foobar接口中,myFunc是泛型方法,要求该方法必须能接收foo或bar任意一种类型的参数,并根据参数类型返回对应结果。但你的myClass只实现了接收foo参数的分支,不符合接口的要求——TS会强制检查实现类的方法是否能处理接口定义的所有合法输入类型(包括bar),因此报错。

解决方案一:通过方法重载实现完整逻辑

在类中添加重载签名,覆盖所有参数类型的处理分支,同时编写通用的实现逻辑:

type foo = {
  statusCode: number;
  body: string;
}
type fooReturn = string; // 实际场景中可以是复杂类型

type bar = {
  results: [];
}
type barReturn = number; // 实际场景中可以是复杂类型

interface foobar {
  myFunc<T extends (foo | bar)>(event: T): T extends foo ? fooReturn : barReturn;
}

class myClass implements foobar {
  // 重载签名:对应接口的两种参数-返回类型组合
  myFunc(event: foo): fooReturn;
  myFunc(event: bar): barReturn;
  // 实现签名:处理所有可能的输入类型
  myFunc(event: foo | bar): fooReturn | barReturn {
    // 通过类型守卫判断参数类型,返回对应结果
    if ('statusCode' in event) {
      return 'hello';
    } else {
      return 123;
    }
  }
}

解决方案二:调整接口为方法重载形式

如果不需要保留泛型条件类型,可以直接将接口定义为方法重载形式,实现逻辑会更直观:

type foo = {
  statusCode: number;
  body: string;
}
type fooReturn = string;

type bar = {
  results: [];
}
type barReturn = number;

// 用方法重载定义接口的方法规范
interface foobar {
  myFunc(event: foo): fooReturn;
  myFunc(event: bar): barReturn;
}

class myClass implements foobar {
  // 类中的重载签名,与接口对齐
  myFunc(event: foo): fooReturn;
  myFunc(event: bar): barReturn;
  // 通用实现逻辑
  myFunc(event: foo | bar): fooReturn | barReturn {
    if ('statusCode' in event) {
      return 'hello';
    }
    return 456;
  }
}

内容的提问来源于stack exchange,提问作者Mr Pablo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 19:32:35