typescript 检查“any”类型的类型脚本

cl25kdpy  于 6个月前  发布在  TypeScript
关注(0)|答案(3)|浏览(86)

是否可以使用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

字符串

mum43rcc

mum43rcc1#

你可以测试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

字符串
这个问题的解释就在这个答案中。简而言之,any是故意不合理的,违反了正常的类型规则。你可以检测到这种违反,因为它允许你做一些疯狂的事情,比如把0赋值给1

vulvrdjw

vulvrdjw2#

另一种检测IsAny的方法:

type IsAny<T> = (
  unknown extends T
    ? [keyof T] extends [never] ? false : true
    : false
);

字符串


的数据

643ylb08

643ylb083#

你可以(ab)利用any是几乎所有东西的 * 子类型 * 和 * 超类型 * 的事实。所以内部(分布)条件类型解析为true | false的并集(= boolean)而不是它们中的任何一个。我检查了T extends never,但它也适用于几乎任何其他类型。

type IsAny<T> = boolean extends (T extends never ? true : false) ? true : false;

type A = IsAny<any> // true
type B = IsAny<number> // false
type C = IsAny<unknown> // false
type D = IsAny<never> // false
type E = IsAny<void> // false
type F = IsAny<{}> // false
type G = IsAny<object> // false
type H = IsAny<undefined> // false
type I = IsAny<null> // false

字符串
TypeScript Playground
1,never除外

相关问题