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

