Skip to content

Instantly share code, notes, and snippets.

@enpitsuLin
Last active May 18, 2022 00:53
Show Gist options
  • Select an option

  • Save enpitsuLin/30539766563938d7739ea94bb4b2cd03 to your computer and use it in GitHub Desktop.

Select an option

Save enpitsuLin/30539766563938d7739ea94bb4b2cd03 to your computer and use it in GitHub Desktop.
@enpitsuLin
Copy link
Author

//00016-medium-pop
type Pop<T extends any[]> = T extends [...infer R, infer U] ? R : never;

@enpitsuLin
Copy link
Author

//00008-medium-readonly-2
type MyReadonly2<T, K extends keyof T = keyof T> = Omit<T, K> & {
  readonly [P in keyof T as P extends K ? P : never]: T[P]
}

@enpitsuLin
Copy link
Author

enpitsuLin commented May 17, 2022

//00005-extreme-readonly-keys
type Equals<X, Y> = (<T>() => T extends X ? 1 : 2) extends (<T>() => T extends Y ? 1 : 2) ? true : false;

type GetReadonlyKeys<T> = {
  [P in keyof T]-?: Equals<{ [Q in P]: T[P] }, { -readonly [Q in P]: T[P] }> extends true ? never : P
}[keyof T];

靠发现工具库有Equal类型

import { Equal } from '@type-challenges/utils';
type GetReadonlyKeys<T> = {
  [P in keyof T]-?: Equal <{ [Q in P]: T[P] }, { -readonly [Q in P]: T[P] }> extends true ? never : P
}[keyof T];

主要是构造出取出readonly的类型,这个通过比较T[keyof T]-readonly得到的类型是否相等就可以过滤掉不是readonly的


还有就是两种取出类型索引的方法

// 将key构造到索引类型上然后取出,-?关键,否则对可选索引会取undefined
type A = { [P in keyof Todo2]-?: P }[keyof Todo2]
//内置的keyof
type B = keyof Todo2
type Result = Expect<Equal<A, B>> // true

@enpitsuLin
Copy link
Author

//00020-medium-promise-all
declare function PromiseAll<T extends any[]>(values: readonly [...T]): Promise<{ [K in keyof T]: T[K] extends Promise<infer P> ? P : T[K] }>

其实这里有个对象元组互相转换的问题需要研究下

@enpitsuLin
Copy link
Author

//00730-hard-union-to-tuple
type StringToUnion<T extends string> = T extends `${infer F}${infer R}` ? F | StringToUnion<R> : never

尾递归和模板字符串

@enpitsuLin
Copy link
Author

enpitsuLin commented May 17, 2022

//02822-hard-split
type Split<S extends string, SEP extends string> = Equal<string, S> extends true
  ? string[]
  : S extends `${infer F}${SEP}${infer R}`
  ? R extends ''
    ? [F]
    : [F, ...Split<R, SEP>]
  : S extends ''
  ? SEP extends ''
    ? []
    : ['']
  : [S]

面向case穷举,好像也没看到更优雅的解法😂

@enpitsuLin
Copy link
Author

//00189-easy-awaited
type MyAwaited<X> = X extends Promise<infer T> ? T extends Promise<infer P> ? MyAwaited<T> : T : never

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment