Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
semlinker opened this issue Oct 1, 2021 · 4 comments
Open

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

semlinker opened this issue Oct 1, 2021 · 4 comments

Comments

@semlinker
Copy link
Owner

实现 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

请在下面评论你的答案

@zhaoxiongfei
Copy link

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

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

@jackwangwj
Copy link

type Unpacked = 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

@zjxxxxxxxxx
Copy link

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

@lq-math-dog
Copy link

// 疑问 没有理解到他们的写法
// 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 extends Promise
// ? Unpacked
// : T extends () => void
// ? ReturnType
// : T extends unknown[]
// ? T[number]
// : T;
// // 关于T04解析
// // Unpacked<Promise[]> extends Promise
// type T07 = Unpacked<Promise[]> extends Promise ? true : false; //true
// // 这里为什么是true
// type T08 = Promise[] extends Promise ? true : false; //false
// type T09 = Promise extends Promise ? true : false; //true
// type Test = T
// type T071 = Test<Promise[]> extends Promise ? true : false; //false
// 44.2
type Unpacked = T extends (infer U)[]
? U
: T extends (...args: any[]) => infer U
? U
: T extends Promise
? 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 ? true : false;//true

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants