Skip to content
Go back

deepkit的复杂类型例子

Updated:

首先看输入代码:

interface User {
    id: number;
    name: string;
    password: string;
}
type ReadUser = Omit<User, 'password'>;
const type = typeOf<ReadUser>();

编译后的结果包含了几个关键的类型定义:

const __ΩOmit = ['T', 'K', () => __ΩPick, () => __ΩExclude, 'Omit', 'b!b"e!!e!!ge!"o$#o##w%y'];
const __ΩPick = ['T', 'K', 'Pick', 'l+e#!e"!fRb!b"Pde""N#!w#y'];
const __ΩExclude = ['T', 'U', 'Exclude', 'l6!Re$!RPe#!e$"qk#%QRb!b"Pde"!p)w#y'];
const __ΩUser = ['id', 'name', 'password', 'User', 'P\'4!&4"&4#Mw$y'];
const __ΩReadUser = [() => __ΩOmit, () => __ΩUser, "password", 'ReadUser', 'n".#o!#w$y'];

基本编码规则

每个类型定义的格式都是数组,以 __ΩUser 为例:

const __ΩUser = ['id', 'name', 'password', 'User', 'P\\'4!&4"&4#Mw$y'];

数组的组成:

以 ‘P’4!&4”&4#Mw$y’ 为例,让我们拆解每个字符的含义:

P - Property(对象类型)
n - Named Type(命名类型)
b - Basic Type(基础类型)
l - List(列表/数组)
e - Expression(表达式)
o - Operation(操作)
R - Reference(引用)

让我们分析 ReadUser 的转换过程

type ReadUser = Omit<User, 'password'>;

编译结果:

const __ΩReadUser = [() => __ΩOmit, () => __ΩUser, "password", 'ReadUser', 'n".#o!#w$y'];

编码 ‘n”.#o!#w$y’ 的含义:

Omit类型的编码

const __ΩOmit = ['T', 'K', () => __ΩPick, () => __ΩExclude, 'Omit', 'b!b"e!!e!!ge!"o$#o##w%y'];

这个编码更复杂,因为Omit是通过Pick和Exclude组合实现的:

当编译器处理 Omit<User, 'password'> 时:

  1. 首先识别这是一个类型操作
  2. 解析User类型定义
  3. 解析字面量类型 ‘password’
  4. 生成新的类型定义,移除指定的属性
  5. 最终生成运行时可用的类型信息

Suggest Changes

Next Post
deepkit学习-bytecode生成