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

时间:2018-12-17 12:16:37

标签: typescript generics typescript-typings

我希望实现的目标是:

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

[EDIT]基于评论,让我用一个实际的例子改写:
假设T是UInt8Array,等于U也是UInt8Array
等效项由相同的类型定义。

[编辑2] 基于@ daniel-hilgarth的答案
如果我们假设T和U是数字,它在实际用法中就不会像T extends U一样工作(请参阅下文),T将被强制转换为传递的数字的实例,因为T不会是{{1 }},但T将是扩展类型number的{​​{1}}。因此,如果U为2,它将不会扩展number

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

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 extends U

我希望它可以澄清这个问题。

可以做到吗?

1 个答案:

答案 0 :(得分:4)

当前,对于条件类型,您只能问一个问题: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