SAPUI5调用UIComponent.getRouterFor报any类型返回TS错误
SAPUI5 TypeScript项目"Unsafe return of an 'any' typed value"报错排查
@typescript-eslint/no-unsafe-return规则触发的判断逻辑非常明确:函数任意返回路径上存在被TypeScript推导为any类型的值时就会抛错,和你有没有给函数内其他变量标注类型没有直接关系。结合你提到的调用UIComponent.getRouterFor的场景,问题基本出在以下两个方向:
1. 所用版本的@sapui5/ts-types-esm类型声明存在缺陷
1.112以前的@sapui5/ts-types-esm包中,UIComponent.getRouterFor方法的返回值确实被错误标注为any,没有绑定正确的Router类型。哪怕你手动给接收返回值的变量标注了Router类型,只要直接return该方法的调用结果,TS依然会识别到原始调用的返回值是any,触发ESLint报错。
- 验证方法:将鼠标悬停在代码中
UIComponent.getRouterFor()的调用位置,查看TS弹出的类型提示,如果显示返回值为any,即可确认是类型包本身的问题,和你的业务代码写法无关。 - 修复方案:
- 优先将
@sapui5/ts-types-esm升级到与你项目SAPUI5运行时版本匹配的最新补丁版本,1.112及以上版本已经修正了该方法的类型定义,会正确返回sap/ui/core/routing/Router类型实例。 - 受项目限制暂时无法升级类型包时,可以在调用处增加类型断言做临时修复,示例写法:
import Router from "sap/ui/core/routing/Router"; // 其余代码省略 return UIComponent.getRouterFor(this) as Router;
- 优先将
2. 方法内this上下文未标注正确类型
在Controller中封装获取Router的工具方法时,很多开发者只会给方法返回值标注Router类型,忽略了给方法内的this绑定正确的Controller类型,会导致TS推导getRouterFor入参类型时匹配失败,fallback到any类型推导,连带方法返回值被识别为any触发报错。
- 错误写法示例:
// 缺失this的类型标注 private getRouter(): Router { // 此处this被推导为any,导致getRouterFor返回值被识别为any return UIComponent.getRouterFor(this); } - 正确写法示例:
import Controller from "sap/ui/core/mvc/Controller"; import Router from "sap/ui/core/routing/Router"; import UIComponent from "sap/ui/core/UIComponent"; // 显式标注this的类型 private getRouter(this: Controller): Router { // 类型包版本正常时无需额外加as Router断言 return UIComponent.getRouterFor(this); }
临时绕过方案
如果确认类型逻辑无误、暂时无法修正类型定义,可以在对应代码行上方添加注释绕过单条规则检查,不推荐直接全局关闭该规则:
// eslint-disable-next-line @typescript-eslint/no-unsafe-return return UIComponent.getRouterFor(this);
内容的提问来源于stack exchange,提问作者Fjaoos
相关产品推荐
相关产品推荐

