繁体   English   中英

打字稿>泛型>联合约束

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM