TypeScript泛型错误:类型'number'无法赋值给类型'U'
解决TypeScript类型不兼容问题
你遇到的问题核心是:U是number的子类型,但+a返回的是宽泛的number类型,TypeScript不允许将宽泛类型赋值给更具体的子类型。比如U可以是12这种数字字面量类型,而+a只能保证是number,无法确保刚好匹配U的具体类型,所以报错。
下面是几种可行的解决方式:
方式一:使用类型断言
如果你确定业务逻辑里+a的结果一定符合U的类型,可以用类型断言强制告诉TypeScript这一点:
function foo<T extends string, U extends number>(a: T): U { return +a as U; } foo<string, number>('12');
方式二:让返回类型和输入字符串关联(更精准)
如果希望返回的类型是输入字符串对应的数字字面量(比如输入'12'返回类型是12而非宽泛number),可以用类型映射实现:
// 把数字字符串转成对应数字字面量类型的工具类型 type StringToNumber<S extends string> = S extends `${infer N extends number}` ? N : never; function foo<T extends `${number}`>(a: T): StringToNumber<T> { return +a as StringToNumber<T>; } // 调用时不用手动指定泛型,TS会自动推导返回类型为12 foo('12');
方式三:移除多余的U泛型
如果不需要U的具体子类型,直接返回number类型更简洁,毕竟+a本来就是标准number:
function foo<T extends string>(a: T): number { return +a; } foo('12');
内容的提问来源于stack exchange,提问作者Indraraj26
相关产品推荐
相关产品推荐

