semlinker/awesome-typescript

「重学TS 2.0 」TS 练习题第三十九题

Opened this issue · 5 comments

实现 IsAny 工具类型,用于判断类型 T 是否为 any 类型。具体的使用示例如下所示:

type IsAny<T> = // 你的实现代码

type I0 = IsAny<never> // false
type I1 = IsAny<unknown> // false
type I2 = IsAny<any> // true

请在下面评论你的答案

type IsAny<T> = 0 extends 1 & T ? true : false;

type I0 = IsAny<never>; // false
type I1 = IsAny<unknown>; // false
type I2 = IsAny<any>; // true

思路: 利用任何类型和any交叉都等于any来实现。

// unknown 只能赋给 unknown 或者 any
type IsAny<T> = [unknown] extends [T] ? ([T] extends [string] ? true : false) : false

type I0 = IsAny<never> // false
type I1 = IsAny<unknown> // false
type I2 = IsAny<any> // true

type IsAny = [unknown] extends [T]
? [T] extends [string]
? true
: false
: false

type I0 = IsAny // false
type I1 = IsAny // false
type I2 = IsAny // true

// 解法: any的特性是与任意值并得出的值为本身
// 我们随便找两个不同的值即可
type IsAny<T> = 'a' extends 'b' & T ? true : false

几何之美

// 实现 IsAny 工具类型,用于判断类型 T[] 是否为 any 类型。具体的使用示例如下所示:
// type IsAny<T[]> = // 你的实现代码
// type I0 = IsAny<never> // false
// type I1 = IsAny<unknown> // false
// type I2 = IsAny<any> // true

type IsAny<T> = T[] extends never[]
  ? false
  : T[] extends string[]
  ? T[] extends number[]
    ? T[] extends boolean[]
      ? T[] extends object[]
        ? T[] extends unknown[]
          ? T[] extends symbol[]
            ? T[] extends null[]
              ? T[] extends undefined[]
                ? T[] extends bigint[]
                  ? T[] extends any[]
                    ? true
                    : false
                  : false
                : false
              : false
            : false
          : false
        : false
      : false
    : false
  : false
type I00 = IsAny<never> // false
type I11 = IsAny<unknown> // false
type I22 = IsAny<any> // true