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
相关产品推荐
相关产品推荐

