Skip to content
Go back

deepkit学习

Updated:

作者给ts提了建议想要typescript把compiler暴露出来:

https://github.com/microsoft/TypeScript/issues/47658

开发文档:

https://github.com/deepkit/deepkit-framework/blob/master/DEVELOPMENT.md

Deepkit 运行时类型与字节码实现

Deepkit Enterprise TypeScript Framework 通过其独特的运行时类型系统,为类型检查、类型转换和约束验证提供了强大的支持。核心创新在于使用字节码(Bytecode)而非传统的可序列化 JavaScript 对象来表示类型信息。这个框架运行的本质是hack了typescript的源码,把一些类型信息在转换过程中保存了下来,并做了一层转换(最终是bytecode)。 本文将详细探讨 Deepkit 为什么选择字节码、其类型检查机制、支持的功能,以及具体的实现方式。


一、为什么 Deepkit 选择字节码表示类型

1. 背景与问题

传统的类型信息存储方式(如 reflect-metadata 或序列化的 JavaScript 对象)在复杂场景下存在以下问题:

2. 字节码的优势

Deepkit 选择字节码表示类型信息,原因如下:

3. 对比序列化对象


二、Deepkit 的类型检查机制

1. 当前实现

Deepkit 的字节码解释器专注于静态类型的编译和检查:

2. 未来潜力

字节码设计为扩展提供了可能性:

这种架构可能显著提升 TypeScript 的类型检查性能并简化缓存管理。


三、Deepkit 支持的功能

Deepkit 的运行时类型系统支持以下功能:


四、Deepkit 如何实现字节码表示

1. 类型解析过程

Deepkit 通过修改 TypeScript 编译器(tsc)并注入自定义逻辑,将类型信息编码为字节码。流程如下:

  1. 编译时@deepkit/type-compiler 拦截 TypeScript 类型信息。
  2. 序列化:将类型信息打包为紧凑的 Packed 格式。
  3. 注入:将字节码挂载到目标对象的 __type 属性。
  4. 运行时:通过 reflect() 方法解析字节码,生成 Type 对象。

2. __type 的挂载机制

3. Processor 的处理流程

Processor 类负责解析字节码并执行类型计算(文件路径:deepkit-framework/packages/type/src/reflection/processor.ts)。

4. 字节码格式

字节码是一种紧凑的操作序列(详见 Deepkit 文档),例如:


五、代码示例

示例 1:简单函数和类

示例 2:带注释的类和函数


六、总结

Deepkit 选择字节码表示类型信息是为了追求更小的代码体积、更低的运行时开销和更高的动态计算能力。其实现通过修改 TypeScript 编译器,在编译时将类型信息编码为字节码并注入到 __type 属性,运行时通过 Processor 解释字节码生成类型对象。这种设计不仅高效支持静态类型检查,还为未来的高性能类型检查器奠定了基础。

Deepkit 的字节码架构是其运行时类型系统的核心创新,适用于需要高性能类型管理的现代 TypeScript 应用。



Deepkit 的依赖注入与 TypeScript 集成

Deepkit Framework 的依赖注入(Dependency Injection, DI)实现独具特色,它摒弃了对 reflect-metadata 的依赖,转而使用自定义的运行时类型系统。这种设计不仅性能更优,还与框架的其他功能(如验证、序列化)无缝集成。本文将详细探讨其实现原理、与 TypeScript 的集成方式以及类型信息的存储与导出机制。


一、Deepkit 依赖注入的核心实现

1. 运行时类型系统:@deepkit/type

2. 依赖注入核心逻辑:@deepkit/injector

3. 类型信息的获取


二、与 reflect-metadata 的对比

1. reflect-metadata 的性能开销

2. Deepkit 的优化实现


三、Deepkit 如何集成 TypeScript

Deepkit 通过自定义转换器(Transformer)“hack”进 TypeScript 编译管道,具体实现如下:

1. 修改 TypeScript 编译器

2. 自定义转换器实现

3. 构建工具集成


四、类型信息的存储与导出

1. 存储方式

2. 导出机制

3. 使用流程


五、Deepkit 设计的优点

  1. 性能优化
    • 编译时生成类型信息,避免运行时反射。
    • JIT 容器缓存动态生成的对象。
  2. 类型支持
    • 支持泛型、接口等高级 TypeScript 特性。
  3. 集成性
    • 与验证、序列化等功能无缝协作。
  4. 灵活性
    • 模块化依赖注入,支持跨模块类型共享。

Suggest Changes

Previous Post
deepkit中的type compiler调试
Next Post
monad