2020-06-01

2020-06-01

[2020-06-01]使用 eggjs 的 extend 扩展 context 新增一个带泛型参数的函数, 调用时报错 TS2347: Untyped function calls may not accept type arguments.

[2020-06-01]使用 eggjs 的 extend 扩展 context 新增一个带泛型参数的函数, 调用时报错 TS2347: Untyped function calls may not accept type arguments.

代码如下

// app/extend/context.ts
export default {
  $awaitTo<T = any, E = any>(p: Promise<T>): Promise<{ data: T; err: E }> {
    return p.then(
      (data) => {
        return Promise.resolve({ data, err: null });
      },
      (err) => {
        return Promise.resolve({ err, data: null });
      }
    );
  },
};

// 调用
const request = /* 一个 http 请求 */;
// 这句在开发时是不会报错的
// 但在编译时会报 Untyped function calls may not accept type arguments.
const { data, err } = await ctx.$awaitTo<Res, Error>(request);

// 感觉是在编译时 ts 没有准确使用类型推到, 导致在编译时 ctx.$awaitTo 被识别成 any, 而不是 <T, E>Function...
// 目前还没定位到时 tsconfig 的问题, 还是 eegg[egg-ts-helper] 的问题

// 目前临时解决方案
// 在 app/extend/context.ts 显式声明类型
declare module 'egg' {
    interface Context {
        $awaitTo<T = any, E = any>(p: Promise<T>): Promise<{ data: T; err: E }>;
    }
}