打字稿如何测试两个泛型是否等效?

zed*_*yas 3 generics typescript typescript-typings

我希望完成的是以下方面的事情:

type AType<T, U> = (T is Equal U) ? T : [T, U]
Run Code Online (Sandbox Code Playgroud)

[编辑] 基于评论,让我用一个实际例子重新表述:
假设 T 是 aUInt8Array等式是如果 U 也是 a UInt8Array
等价由相同的类型定义。

[编辑 2] 基于@daniel-hilgarth 的答案如果我们假设 T 和 U 是数字,
T extends U在实际使用中不起作用(见下文),T 将被转换为传递的数字的实例,如在 T 中那样t be anumber但 T 将是2扩展 type 的 a number。所以如果 U 是3它不会延长2

抱歉,如果不清楚,请检查下面的实施

type AType<T, U> = T extends U ? U extends T ? T : [T, U] : [T, U]

const fn = <T extends string | number, U extends string | number>(
  x: T,
  y: U,
): AType<T, U> => {
  throw new Error ('Yet to implement !')
}

const a = fn (2, 2)    // correct number
const b = fn (2, 's')  // correct [number, string]
Run Code Online (Sandbox Code Playgroud)

const c = fn (2, 3)    // incorrect [number, number]
Run Code Online (Sandbox Code Playgroud)

我需要的不是:

  • 如果 T extends U

但:

  • 如果T extends无论如何U extends

我希望它澄清了这个问题。

可以做到吗?

Dan*_*rth 5

目前,对于条件类型,您只能提出一个问题:extends. 没有平等,但我们可以通过使用两个检查来模拟它:

type AType<T, U> = T extends U ? U extends T ? T : [T, U] : [T, U]
Run Code Online (Sandbox Code Playgroud)

首先,我们检查是否 Textends U。如果是这样,我们检查是否Uextends T。只有当TU的类型完全相同时,两个条件才能同时为真,因此我们返回T

这在 Typescript 3.2 中正常工作:

证明

链接

另外,值得一读以了解一般的条件类型:https : //koerbitz.me/posts/a-look-at-typescripts-conditional-types.html