[英]Typescript > Generics > Union Constraint
为什么打字稿编译器会引发以下错误:
Operator '+' cannot be applied to types 'T' and 'T'.
,
编译时:
export const addNumbersOrCombineStrings = <T extends string | number>(
param1: T,
param2: T
): T => param1 + param2
?
GitHub中的相关问题是Microsoft / TypeScript#12410 。 瑞安·卡瓦诺 ( Ryan Cavanaugh)在评论中解决了您的特定问题:
T + T
,其中T
延伸string | number
string | number
仍不允许的-我们不觉得这是一个很好的用例,因为不管你得到串联或另外是不可预测的,因此一些人不应该做的事情。
如果您只是尝试添加两个string | number
也会发生同样的事情string | number
string | number
类型一起:
declare const x: string | number;
x + x; // error!
// Operator '+' cannot be applied to types 'string | number' and 'string | number'.
因此,我想他们很认真,他们不希望您这样做。 您始终可以随心所欲地编译编译器,并通过类型断言禁用类型检查;
export const addNumbersOrCombineStrings = <T extends string | number>(
param1: T,
param2: T
): T => (param1 as any) + param2;
但是您不想这样做,尤其是因为T extends string | number
T extends string | number
会推断一个字符串或数字文字,这不会给您预期的行为:
const notThree = addNumbersOrCombineStrings(1, 2);
// const notThree: 1 | 2
const notHi = addNumbersOrCombineStrings("h", "i");
// const notHi: "h" | "i"
糟糕,这些结果是文字的并集。 为了解决泛型问题,您可能要开始使用特殊的条件类型来扩展字面量:
type SN<T extends string | number> = (T extends string ? string : never) |
(T extends number ? number : never);
export const addNumbersOrCombineStrings = <T extends string | number>(
param1: T,
param2: SN<T>
): SN<T> =>
(param1 as any) + param2;
const n = addNumbersOrCombineStrings(1, 2); // const n : number;
const s = addNumbersOrCombineStrings("h","i"); // const s: string;
// and do you even want to support this:
const sn = addNumbersOrCombineStrings(
Math.random() < 0.5 ? "a" : 1,
Math.random() < 0.5 ? "b" : 2
); // const sn: string | number;
但是,也可能存在边缘情况(例如,当传入的值实际上是string | number
就像上面的sn
情况一样)。 我开始明白为什么他们不喜欢支持添加string | number
类型的值。 一起string | number
。 无论如何,希望能有所帮助。 祝好运!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.