打字稿检查'any'类型

sam*_*mdd 4 typescript

是否可以any使用打字稿条件语句检查确切的类型?

type IsAny<T> = T extends any ? true : never

type A = IsAny<any> // true
type B = IsAny<number> // never
type C = IsAny<unknown> // never
type D = IsAny<never> // never
Run Code Online (Sandbox Code Playgroud)

jca*_*alz 8

是的,您可以测试any

type IfAny<T, Y, N> = 0 extends (1 & T) ? Y : N; 
type IsAny<T> = IfAny<T, true, never>;
type A = IsAny<any> // true
type B = IsAny<number> // never
type C = IsAny<unknown> // never
type D = IsAny<never> // never
Run Code Online (Sandbox Code Playgroud)

对此的解释在此答案中。简而言之,这any是故意不健全的,并且违反了正常的类型规则。您可以检测到这种违规,因为它会让您疯狂地执行诸如分配0给的操作1

  • @artem 这是有意的;`never` 被认为是“空联合”,因此它[总是映射到分布式条件类型中的 `never`](https://github.com/Microsoft/TypeScript/issues/23182#issuecomment-379094672)。有趣的是 `any` 不会被分发,这就是为什么那个版本的 `IfAny` 可以区分 `any` 和 `never` ......当然它通过返回 `never` 而不是 `N` 来做到这一点,这可能是不希望的。 (3认同)
  • 一个简单的类型IfAny &lt;T,Y,N&gt; = T永远不会扩展?Y:N;似乎也有同样的效果。看起来,即使“ T”为“从不”,“ T永不扩展”也分布在“ T”上,不确定是否是故意的。 (2认同)
  • 当 T 是 never 时,来自 `@types/react` 的这个会发出 false(不是 never): `type IsExactlyAny&lt;T&gt; = boolean extends (T extends never ? true : false) ? 真:假;` (2认同)

ecz*_*czn 5

另一种检测 IsAny 的方法:

type IsAny<T> = (
  unknown extends T
    ? [keyof T] extends [never] ? false : true
    : false
);
Run Code Online (Sandbox Code Playgroud)

IsAny 具有某些值的结果