You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级Hilla 2.2.0至2.3.2遇类型约束错误:unknown不符合Record<never, never>

解决Hilla中泛型接口自动生成Model时的TypeScript约束错误

问题场景

项目基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 23:55:17