typescript 如何测试两个泛型是否等效?

标签 typescript generics typescript-typings

<分区>

我希望完成的是:

type AType<T, U> = (T is Equal U) ? T : [T, U]

[编辑] 基于评论让我用一个实际的例子来改写:
让我们假设 T 是一个 UInt8Array 如果 U 也是一个 UInt8Array 则相等。
等价由相同的类型定义。

[编辑 2] 基于@daniel-hilgarth 的回答
它不起作用,因为 T extends U 在实际使用中(见下文)如果我们假设 T 和 U 是数字,T 将被转换为传递的数字的实例,因为 T 不会是一个 number 但 T 将是一个扩展 number 类型的 2。所以如果 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]

但是

const c = fn (2, 3)    // incorrect [number, number]

我需要的不是:

  • 如果 T 扩展了 U

但是:

  • 如果 T extends 无论 U extends

我希望它能澄清问题。

可以吗?

最佳答案

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

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

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

这在 Typescript 3.2 中可以正常工作:

proof

( link )

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

关于 typescript 如何测试两个泛型是否等效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53815074/

相关文章:

javascript - 使用 Angular Directive(指令)更改选定的列表元素颜色

angular - 从 Angular 5 升级到 Angular 6 后 : Current document does not have a doctype

c# - 为什么 C# 不允许将泛型类型用作泛型类中的属性?

c# - C#泛型的属性限制

reactjs - 在命名空间 Typescript 项目中使用 NPM 模块

javascript - 根据提供的长度将重复的对象创建到数组中

json - 如何强制 TypeScript 转译原型(prototype)方法?

typescript - 如何知道在 TypeScript 中使用哪种类型?

c# - Automapper、泛型、dto 娱乐时间

typescript - 尝试对新的明确类型定义运行 lint 时出错