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

Angular 18.1中ModelSignal泛型使用联合类型出现编译错误的解决方案求助

Angular 18.1中ModelSignal泛型使用联合类型出现编译错误的解决方案求助

嘿,各位大佬好!我在Angular 18.1里碰到了一个关于ModelSignal泛型的类型问题,折腾了半天没搞定,想请大家帮忙支支招~

最开始我写了这段代码,运行完全正常:

public unit = model('px');

查看类型的话,它确实是ModelSignal<string>,没毛病。

但我想把这个model的类型限定为更精确的联合类型'px' | '%',于是改成了这样:

public unit: ModelSignal<'px' | '%'> = model('px');

结果直接弹出编译错误,错误信息如下:

Type 'ModelSignal<"px">' is not assignable to type 'ModelSignal<"%", "px">'.
The types of '[SIGNAL].transformFn' are incompatible between these types.
Type '((value: "px") => "px") | undefined' is not assignable to type '((value: "%", "px") => "%", "px") | undefined'.
Type '(value: "px") => "px"' is not assignable to type '((value: "%", "px") => "%", "px")'.
Types of parameters...

试了好几种调整方式都没解决,有没有人能告诉我正确的写法应该是什么样的?为什么直接给变量声明联合类型的ModelSignal会报错呢?


可行的解决方案

其实正确的做法是直接给model函数指定泛型参数,而不是在变量上强制声明类型。这样写就可以完美解决问题:

public unit = model<'px' | '%'>('px');

这样推导出来的类型就是ModelSignal<'px' | '%'>,完全符合需求,也不会再有编译错误。

错误原因解释

之前的写法报错,是因为model函数会根据你传入的初始值'px'自动推导泛型,默认生成的是ModelSignal<'px'>类型。而你把变量类型声明为ModelSignal<'px' | '%'>,这两个类型的transformFn属性不兼容——前者的transformFn只接受'px'类型的参数,而后者需要能接受'px' | '%'的参数,所以编译器判定这两个类型无法赋值。

备注:内容来源于stack exchange,提问作者Christian Vincenzo Traina

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.16 09:43:12