如何确定一个类型是void还是any



如何确定类型是void还是any

type IsAny = void extends any ? true : false   // true
type IsVoid = any extends void ? true : false  // true

基于以上内容,不可能确定类型是void还是any。有没有其他方法可以确定它是两者中的哪一个?

voidany并不互斥:void也是any。你可以通过与他们联合来看到这一点。如果它们是排他性的,void不会消失,只让any:

type T = void | any // any

知道了这一点,您的IsAny解析为true是正常的。

至于您的IsVoid类型,它解析为boolean,实际上是true | false。通过将truefalse更改为12,您可以看到这一点。然后您将获得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

相关内容

最新更新