升级Hilla 2.2.0至2.3.2遇类型约束错误:unknown不符合Record<never, never>
问题场景
项目基于Hilla开发,依赖类路径下第三方jar包中的自动生成Java库代码,该场景在Hilla 2.2.0中可正常运行,但受PR#1252变更影响,升级后出现TypeScript编译错误。
Java库中的泛型接口定义:
public interface HlaTimeStamped<T> { T getValue(); HlaTimeStamp getTimeStamp(); HlaLogicalTime getLogicalTime(); }
Hilla自动生成的前端代码如下:
HlaTimeStamped.ts
/* HlaTimeStamped.ts */ import type HlaLogicalTime_1 from "./HlaLogicalTime.js"; import type HlaTimeStamp_1 from "./HlaTimeStamp.js"; interface HlaTimeStamped { value: unknown; timeStamp?: HlaTimeStamp_1; logicalTime?: HlaLogicalTime_1; } export default HlaTimeStamped;
HlaTimeStampedModel.ts
/* HlaTimeStampedModel.ts */ class HlaTimeStampedModel<T extends HlaTimeStamped_1 = HlaTimeStamped_1> extends ObjectModel_1<T> { static override createEmptyValue = makeObjectEmptyValueCreator_1(HlaTimeStampedModel); get value(): ObjectModel_1<unknown> { /* Type 'unknown' does not satisfy the constraint 'Record<never, never>'. */ return this[_getPropertyModel_1]("value", (parent, key) => new ObjectModel_1(parent, key, false)); } get timeStamp(): HlaTimeStampModel_1 { return this[_getPropertyModel_1]("timeStamp", (parent, key) => new HlaTimeStampModel_1(parent, key, true)); } get logicalTime(): HlaLogicalTimeModel_1 { return this[_getPropertyModel_1]("logicalTime", (parent, key) => new HlaLogicalTimeModel_1(parent, key, true)); } }
构建时触发错误:Type 'unknown' does not satisfy the constraint 'Record<never, never>'
错误根源
Hilla的ObjectModel泛型约束发生了变更:
- 旧版本声明:
export declare class ObjectModel<T> extends AbstractModel<T> - 新版本声明:
declare class ObjectModel<T extends Record<never, never> = Record<never, never>> extends AbstractModel<T> { ... }
由于Java接口的泛型T没有指定边界,Hilla代码生成器将value的类型推断为unknown,而新版本ObjectModel要求泛型参数必须是Record类型,unknown不满足该约束,因此报错。
修复方案
1. 调整Java接口的泛型边界
修改第三方jar中的Java接口,给泛型T添加明确的边界,确保Hilla生成的TypeScript类型不是unknown。例如:
// 让T继承Java的Record类型(或自定义的对象类/接口) public interface HlaTimeStamped<T extends Record> { T getValue(); HlaTimeStamp getTimeStamp(); HlaLogicalTime getLogicalTime(); }
这样代码生成器会将value的类型推断为对应对象类型,满足ObjectModel的泛型约束。
2. 临时降级Hilla版本
如果无法修改第三方Java库代码,可暂时降级回Hilla 2.2.0,避免约束变更带来的编译错误,待后续找到合适修复方案或官方推出兼容补丁后再升级。
3. 自定义代码生成模板
若项目允许自定义Hilla的代码生成逻辑,可修改Model生成模板:当属性类型为unknown时,改用无约束的AbstractModel<unknown>替代ObjectModel<unknown>,因为AbstractModel没有泛型约束限制。
4. 向Hilla官方提交兼容Issue
该问题属于代码生成器的兼容性缺陷,泛型接口未指定边界时生成的unknown类型无法适配新的ObjectModel约束。可向Hilla官方提交Issue,说明该场景,请求修复代码生成逻辑,例如对unknown类型的属性使用兼容的Model类型。
内容的提问来源于stack exchange,提问作者AlanW

