如何确定类型是void
还是any
?
type IsAny = void extends any ? true : false // true
type IsVoid = any extends void ? true : false // true
基于以上内容,不可能确定类型是void
还是any
。有没有其他方法可以确定它是两者中的哪一个?
void
和any
并不互斥:void
也是any
。你可以通过与他们联合来看到这一点。如果它们是排他性的,void
不会消失,只让any
:
type T = void | any // any
知道了这一点,您的IsAny
解析为true
是正常的。
至于您的IsVoid
类型,它解析为boolean
,实际上是true | false
。通过将true
和false
更改为1
和2
,您可以看到这一点。然后您将获得1 | 2
。
这是因为您的any
类型可能是void
或其他非void
的类型。所以我们不知道它是否扩展了void
。
要知道一个类型是any
,没有什么特别的,还是void
,没有什么不特别的,你可以这样做(灵感来自这个答案(:
type IsStrictAny<T> = 0 extends (1 & T) ? T : never;
type A = IsStrictAny<any> // any
type B = IsStrictAny<void> // never
type IsVoid<T> = T extends void ? T : never
type IsNotStrictAny<T> = T extends IsStrictAny<T> ? never : T
type IsStrictVoid<T> = IsVoid<T> & IsNotStrictAny<T>
type C = IsStrictVoid<any> // never
type D = IsStrictVoid<void> // void