# TypeScript 版本框架设计

Astroboy 的 1.1.0+ 版本针对 TypeScript 进行了一次重新设计,优化了框架定义体系,全面支持 TypeScript 语言开发环境。

# 重新设计框架定义

为了支持无限定义扩展,Astroboy 新版重新设计了针对 TS 的框架申明,使用可配置升级的接口来自定义 Astroboy 各个部分的静态语义。

框架定义体系部分源代码

export interface IBaseContextDefine {
  ctx: any;
  app: any;
  config: any;
  services: any;
  controllers: any;
  libs: any;
}

IBaseContextDefine 定义了整个 Astroboy 框架各个部分的基础类型 any,使用 any 的好处是作为底层接口可以更好的适配上层扩展,实现接口收拢的需求。

比如:

export interface IBaseApplication<F extends any = {}> extends Koa {
  config: F;
}

export interface IBaseContext<F extends any = {}, A extends IBaseApplication = IBaseApplication<F>>
  extends Koa.Context {
  app: A;
  config: F;
  request: Koa.Request & {
    body: any;
  };
}

/**
 * ## astroboy 基础上下文扩展结构
 *
 * @author Big Mogician
 * @export
 * @interface IAstroboyContextDefine
 * @extends {IBaseContextDefine}
 */
export interface IAstroboyContextDefine extends IBaseContextDefine {
  ctx: IBaseContext<{}>;
  app: IBaseApplication<{}>;
  config: {};
  services: {};
  controllers: {};
  libs: {};
}

通过继承基础接口,使得部分定义范围得以收窄,更好的描述应用程序而又不破坏底层框架扩展性。

框架定义在 Astroboy 中的存在感非常强烈,几乎所有的地方(诸如 service、controller、ctx 等等地方)都会被用到来约定成员的类型。

参考一下 BaseClass 的源代码:

export class BaseClass<DEFINE extends Partial<IBaseContextDefine> = IAstroboyContextDefine>
  implements IAstroboyCtxExtends<DEFINE> {
  protected app: DEFINE['app'];
  protected config: DEFINE['config'];
  protected ctx: DEFINE['ctx'];

  constructor(ctx: DEFINE['ctx']) {
    this.ctx = <any>ctx;
    this.app = <any>(ctx && ctx.app);
    this.config = <any>(ctx && ctx.app && ctx.app.config);
  }

  // ...
}

在框架定义中定一个各个部件的定义会被标注到 BaseClass 的各个部分,所有基予 BaseClass 的 service 或者 controller 都可以完整地访问到 ctxappconfig 的类型声明。

# 从 Astroboy 引入接口

Astroboy 的框架定义都被维护在"astroboy/definitions"目录下:

.
├── extends                   # 框架扩展部分(对koa原生对象做的字段扩展)
├   ├── app.ts                # 对koa/app部分做的扩展
├   └── context.ts            # 对koa/ctx部分做的扩展
├── plugins                   # Astroboy插件的定义导出
├   └── index.ts              # Astroboy插件的合并定义导出(单个插件定义在app/plugins文件夹内)
├── base.ts                   # 基础框架契约
├── config.ts                 # 配置相关的约定
├── core.ts                   # 框架核心接口定义
└── index.ts                  # 导出模块出口

框架主要部件的定义速览:

import { ... } from "astroboy/definitions";

/**
 * astroboy 框架的配置参数
 *
 * @author Big Mogician
 * @export
 * @interface IAstroboyBootstrapOptions
 * @extends {BootstrapOptions}
 */
export interface IAstroboyBootstrapOptions extends BootstrapOptions {}

/**
 * ## astroboy 基础上下文扩展结构
 *
 * @author Big Mogician
 * @export
 * @interface IAstroboyContextDefine
 * @extends {IBaseContextDefine}
 */
export interface IAstroboyContextDefine extends IBaseContextDefine {
  ctx: IBaseContext;
  app: IAstroboyApplication;
  config: PureObject;
  services: {};
  controllers: {};
  libs: {};
}

/**
 * ## astroboy 基础app结构
 *
 * @author Big Mogician
 * @export
 * @interface IAstroboyApplication
 * @extends {IAstroboyPluginAppMixins}
 * @extends {IAstroboyAppExtends<CONFIG>}
 * @template CONFIG
 */
export interface IAstroboyApplication<CONFIG extends PureObject = PureObject>
  extends IAstroboyPluginAppMixins,
    IPureAstroboyApplication<CONFIG> {}

/**
 * astroboy 基础Ctx结构
 *
 * @author Big Mogician
 * @export
 * @interface IAstroboyContext
 * @extends {IAstroboyPluginCtxMixins}
 * @extends {IAstroboyCtxExtends<CONFIG, A>}
 * @template CONFIG
 * @template APP
 */
export interface IAstroboyContext<DEFINE extends Partial<IBaseContextDefine> = IAstroboyContextDefine>
  extends IAstroboyPluginCtxMixins,
    IPureAstroboyContext<DEFINE> {}

/**
 * astroboy 基础configs结构
 *
 * @author Big Mogician
 * @export
 * @interface IAstroboyConfigs
 * @extends {IAstroboyPluginConfigMixins}
 * @extends {IBaseProjectConfig}
 */
export interface IAstroboyConfigs extends IAstroboyPluginConfigMixins, IBaseProjectConfig {}

/**
 * astroboy 基础plugins结构
 *
 * @author Big Mogician
 * @export
 * @interface IAstroboyPlugins
 * @extends {IAstroboyPluginRegisterMixins}
 * @extends {IBasePluginConfig}
 */
export interface IAstroboyPlugins extends IAstroboyPluginRegisterMixins, IBasePluginConfig {}

/**
 * astroboy 基础middlewares结构
 *
 * @author Big Mogician
 * @export
 * @interface IAstroboyMiddlewares
 * @extends {IAstroboyPluginMiddlewareMixins}
 * @extends {IBaseMiddlewareConfig}
 */
export interface IAstroboyMiddlewares extends IAstroboyPluginMiddlewareMixins, IBaseMiddlewareConfig {}

按图索骥吧 😄!