我希望实现的目标是:
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
我希望它可以澄清这个问题。
可以做到吗?
答案 0 :(得分:4)
当前,对于条件类型,您只能问一个问题:extends
。没有相等之处,但是我们可以使用两个检查来模拟它:
type AType<T, U> = T extends U ? U extends T ? T : [T, U] : [T, U]
首先,我们检查T
是否扩展了U
。如果是这样,我们检查U
是否扩展了T
。如果T
和U
的类型完全相同,则两个条件只能同时成立,因此我们返回T
。
这在Typescript 3.2中正常工作:
(link)
此外,值得一读,以了解一般的条件类型:https://koerbitz.me/posts/a-look-at-typescripts-conditional-types.html