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 }>;
}
}