TypeScript严格模式下泛型与默认类型的适配问题
TypeScript严格模式下泛型Block类型适配问题
我正在重构代码以支持TypeScript严格模式,遇到了泛型函数相关的问题。核心是一个接收包含blocks属性对象的函数,该属性使用带默认类型的泛型类型。
类型定义
Context类型
export type Context< S extends VariableSchema = VariableSchema, R extends VariableSchema = VariableSchema, > = { blocks: { [key: string]: Block }; schema: S; result: R; };
Block类型
export type Block< ParamMap extends BlockParamSchema = BlockParamSchema, HandleMap extends { [key: string]: string } = { [key: string]: string }, > = { label: string; parameters: ParamMap; validateParameters: (args: { parameters: ConvertVariableSchemaToObjectType<ParamMap>; getVariableDefinition: (name: string) => Variable; }) => z.AnyZodObject; handles: HandleMap; execute: (args: BlockExecutionApi<ParamMap, HandleMap>) => Promisable<void>; };
使用方式
创建Context
export const deductionCalculationContext = createContext({ blocks: defaultBlocks, schema: { deductionYtd: v.number('Deduction YTD'), eligibleWages: v.number('Eligible Wages'), }, result: { employeeAmount: v.number('Employee Amount'), companyAmount: v.number('Company Amount'), }, });
创建Block实例
所有Block都通过createBlock函数声明,以保证类型安全:
export const conditionBlock = createBlock({ label: 'If', parameters: { when: { label: 'Condition', type: 'unknown', required: true, }, equalTo: { label: 'Equal to', type: 'unknown', required: true, }, }, handles: { true: 'True', false: 'False', }, execute: async ({ parameters, fireHandle }) => { parameters.when === parameters.equalTo ? fireHandle('true') : fireHandle('false'); }, });
问题现象
尽管类型本质一致(仅缺少泛型参数),TypeScript仍无法编译,错误出现在第173行。
已尝试方案
- 省略
blocks并重新声明为非泛型类型可运行,但存在类型安全隐患; - 关闭
strictFunctionTypes可运行,但会破坏其他函数类型安全特性; - 将
blocks属性设为泛型; - 将
blocks属性设为无约束泛型,通过映射类型、条件类型和推断获取泛型值,概念可行但因递归引用无法应用。
需求
希望避免显式传递泛型类型,已知已有库实现该功能,寻求解决方案。
内容的提问来源于stack exchange,提问作者CristianHG
相关产品推荐
相关产品推荐

