基于Koa创建一个可扩展的typescript包,该包具有默认导出和命名导出



我正在创建一个模块,它扩展了Koa并添加了一些基本功能,同时仍然可以由包的消费者进行扩展。事实证明,这是非常具有挑战性的,所以我希望有人知道如何做到这一点。

最终目标是在使用我的包时能够保留类型,如下所示:

// Note default and named export - I have also tried only having named exports
import MyKoa, { isAuth } from 'mykoa';
import Router from 'koa-router';
// How I try to augment MyKoa in the consumer apps
declare module 'mykoa' {
// Doesn't work: cannot use namespace "MyKoa" as value
namespace MyKoa {
interface Options {
isReady: boolean;
}
}
// Doesn't work at all
interface Options {
isReady: boolean;
}
}

const app = new MyKoa();
const router = new Router();
router.get('/', isAuth(), ctx => {
ctx.body = ctx.app.options.isReady; // Typescript should know that (ctx.)app.options.isReady is a boolean
});
app.use(router.routes());
app.listen(3000);

目前我有2个文件:

src/lib/MyKoa.ts:

import Koa from 'koa';
// Augment Koa
declare module 'koa' {
interface Application extends MyKoa {} // This ensures that MyKoa types are retained in koa-router middleware and works fine 
}
// My Koa class
class MyKoa extends Koa {
public options: MyKoa.Options = {};
}
// Declare MyKoa namespace to hold relevant types
declare namespace MyKoa {
interface Options {}
}
export = MyKoa;

src/index.ts:

import MyKoa from './lib/MyKoa';
import isAuth from './lib/isAuth';
export default MyKoa;
export { isAuth };

如果我用文件的完整路径(例如mykoa/dist/lib/mykoa(声明模块,我可以很好地扩展类型,但我不希望包的使用者依赖于我的包的内部目录结构。这可能吗?有没有更好的方法来提供相同的功能?

扩充符号以针对最初定义符号的模块而不是重新导出符号的模块的要求是TypeScript当前已知的限制。我能建议的唯一解决方法是将您想要mykoa的消费者扩充的符号移动到mykoa的主模块中。

最新更新