Typescript 基于缺省和命名导出的膝关节炎扩展包的创建 我创建了一个扩展膝关节炎的模块,并添加了一些基本功能,同时还可以被包装的消费者扩展。这被证明是非常具有挑战性的,所以我希望有人知道如何做到这一点
最终目标是能够在使用我的包时保留类型,如下所示:Typescript 基于缺省和命名导出的膝关节炎扩展包的创建 我创建了一个扩展膝关节炎的模块,并添加了一些基本功能,同时还可以被包装的消费者扩展。这被证明是非常具有挑战性的,所以我希望有人知道如何做到这一点,typescript,Typescript,最终目标是能够在使用我的包时保留类型,如下所示: // 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'
// 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
的主模块中