1+ import { z } from "zod" ;
12import { collectIdentifiers , generate , parse , type ASTNode } from "./parser" ;
23import type { CompileContext , CompiledData , Expression , ExprNode , Variable } from "./types" ;
34
@@ -13,6 +14,11 @@ export interface CompileOptions {
1314 inline ?: boolean ;
1415}
1516
17+ /**
18+ * 表达式上下文类型约束
19+ */
20+ type ExpressionContext = Record < string , Variable < z . ZodType > | Expression < Record < string , unknown > , unknown > > ;
21+
1622/**
1723 * 将表达式树编译为可序列化的 JSON 结构
1824 *
@@ -35,8 +41,8 @@ export interface CompileOptions {
3541 * ```
3642 */
3743export function compile < TResult > (
38- expression : Expression < any , TResult > ,
39- variables : Record < string , Variable < any > > ,
44+ expression : Expression < ExpressionContext , TResult > ,
45+ variables : Record < string , Variable < z . ZodType > > ,
4046 options : CompileOptions = { }
4147) : CompiledData {
4248 const { inline = true } = options ;
@@ -48,12 +54,16 @@ export function compile<TResult>(
4854 } ;
4955
5056 // 第一步:为每个表达式分配唯一 ID
51- const exprIdMap = new WeakMap < Expression < any , any > , symbol > ( ) ;
52- const getExprId = ( expr : Expression < any , any > ) : symbol => {
57+ const exprIdMap = new WeakMap < Expression < Record < string , unknown > , unknown > , symbol > ( ) ;
58+ const getExprId = ( expr : Expression < Record < string , unknown > , unknown > ) : symbol => {
5359 if ( ! exprIdMap . has ( expr ) ) {
5460 exprIdMap . set ( expr , Symbol ( "expr" ) ) ;
5561 }
56- return exprIdMap . get ( expr ) ! ;
62+ const id = exprIdMap . get ( expr ) ;
63+ if ( id === undefined ) {
64+ throw new Error ( "Expression ID not found" ) ;
65+ }
66+ return id ;
5767 } ;
5868
5969 // 为所有变量创建 node
@@ -75,7 +85,7 @@ export function compile<TResult>(
7585
7686 // 第二步:递归收集所有依赖的节点,并检测循环依赖
7787 const exprNodes = new Map < symbol , ExprNode > ( ) ;
78- const collectNodes = ( expr : Expression < any , any > ) : ExprNode => {
88+ const collectNodes = ( expr : Expression < Record < string , unknown > , unknown > ) : ExprNode => {
7989 const exprId = getExprId ( expr ) ;
8090
8191 if ( visited . has ( exprId ) ) {
@@ -92,7 +102,7 @@ export function compile<TResult>(
92102
93103 // 收集表达式上下文中的所有节点
94104 for ( const [ key , contextItem ] of Object . entries ( expr . context ) ) {
95- const item = contextItem as Variable < any > | Expression < any , any > ;
105+ const item = contextItem as Variable < z . ZodType > | Expression < Record < string , unknown > , unknown > ;
96106 if ( item . _tag === "variable" ) {
97107 const varNode = variableNodes . get ( key ) ;
98108 if ( ! varNode ) {
0 commit comments