awesome-typescript icon indicating copy to clipboard operation
awesome-typescript copied to clipboard

「重学TS 2.0 」TS 练习题第四十四题

Open semlinker opened this issue 2 years ago • 4 comments

实现 Unpacked 工具类型,用于对类型执行 “拆箱” 操作。具体的使用示例如下所示:

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

type T00 = Unpacked<string>;  // string
type T01 = Unpacked<string[]>;  // string
type T02 = Unpacked<() => string>;  // string
type T03 = Unpacked<Promise<string>>;  // string
type T04 = Unpacked<Unpacked<Promise<string>[]>>;  // string
type T05 = Unpacked<any>;  // any
type T06 = Unpacked<never>;  // never

请在下面评论你的答案

semlinker avatar Oct 01 '21 10:10 semlinker

type Types = string | number | symbol;
type Unpacked<T> = T extends Types
  ? T
  : T extends (...arg: any) => infer R
    ? R
    : T extends Array<infer A>
      ? A
      : T extends Promise<infer P>
        ? P
        : never;

type T00 = Unpacked<string>;  // string
type T01 = Unpacked<string[]>;  // string
type T02 = Unpacked<() => string>;  // string
type T03 = Unpacked<Promise<string>>;  // string
type T04 = Unpacked<Unpacked<Promise<string>[]>>;  // string
type T05 = Unpacked<any>;  // any
type T06 = Unpacked<never>;  // never

我这个实现实话说很不满意,感觉完全是照着测试用例再写

zhaoxiongfei avatar Oct 02 '21 10:10 zhaoxiongfei

type Unpacked<T> = T extends (...args: any) => infer A ? A : T extends Promise《infer B》 // 《infer B》死活不显示,换成中文的尖括号示意下 ? B : T extends (infer A)[] ? A : T

// 你的实现代码

type T00 = Unpacked; // string type T01 = Unpacked<string[]>; // string type T02 = Unpacked<() => string>; // string type T022 = Unpacked<() => number>; // number type T03 = Unpacked<Promise>; // string type T032 = Unpacked<Promise>; // number type T04 = Unpacked<Unpacked<Promise[]>>; // string type T042 = Unpacked<Unpacked<Promise[]>>; // number type T05 = Unpacked; // any type T06 = Unpacked; // never

jackwangwj avatar Dec 17 '21 02:12 jackwangwj

type Unpacked<T> = T extends Promise<infer V>
  ? Unpacked<V>
  : T extends () => void
  ? ReturnType<T>
  : T extends unknown[]
  ? T[number]
  : T;

zjxxxxxxxxx avatar Mar 24 '22 09:03 zjxxxxxxxxx

// 疑问 没有理解到他们的写法 // 44 实现Unpacked工具类型,用于对类型执行 “拆箱” 操作。
type T00 = Unpacked; // string type T01 = Unpacked<string[]>; // string type T02 = Unpacked<() => string>; // string type T03 = Unpacked<Promise>; // string type T04 = Unpacked<Unpacked<Promise[]>>; // string type T05 = Unpacked; // any type T06 = Unpacked; // never // 44.1 // type Unpacked<T> = T extends Promise<infer V> // ? Unpacked<V> // : T extends () => void // ? ReturnType<T> // : T extends unknown[] // ? T[number] // : T; // // 关于T04解析 // // Unpacked<Promise[]> extends Promise<infer V> // type T07 = Unpacked<Promise[]> extends Promise<infer V> ? true : false; //true // // 这里为什么是true // type T08 = Promise[] extends Promise<infer V> ? true : false; //false // type T09 = Promise extends Promise<infer V> ? true : false; //true // type Test<T> = T // type T071 = Test<Promise[]> extends Promise<infer V> ? true : false; //false // 44.2 type Unpacked<T> = T extends (infer U)[] ? U : T extends (...args: any[]) => infer U ? U : T extends Promise<infer U> ? U : T; // 关于T04解析 type T07 = Unpacked<Promise[]> extends (infer U)[] ? true : false;//false type T08 = Unpacked<Promise[]> extends (...args: any[]) => infer U ? true : false;//false type T09 = Unpacked<Promise[]> extends Promise<infer U> ? true : false;//true

lq-math-dog avatar Aug 05 '22 03:08 lq-math-dog