some my solutions for type-challenges
Last active
May 18, 2022 00:53
-
-
Save enpitsuLin/30539766563938d7739ea94bb4b2cd03 to your computer and use it in GitHub Desktop.
Author
enpitsuLin
commented
May 17, 2022
Author
//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
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] }>其实这里有个对象元组互相转换的问题需要研究下
Author
//00730-hard-union-to-tuple
type StringToUnion<T extends string> = T extends `${infer F}${infer R}` ? F | StringToUnion<R> : never尾递归和模板字符串
Author
//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穷举,好像也没看到更优雅的解法😂
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