TS试炼-4
摘要:
本项目意在于让你更好的了解 TS 的类型系统,编写你自己的类型工具,或者只是单纯的享受挑战的乐趣!我们同时希望可以建立一个社区,在这里你可以提出你在实际环境中遇到的问题,或者帮助他人解答疑惑 - 这些问题也可能被选中成为题库的一部分!
1、为接口添加一个新字段的类型
ts
// https://github.com/type-challenges/type-challenges/blob/main/questions/00527-medium-append-to-object/README.zh-CN.md
type AppendToObject<T, U extends PropertyKey, V> = {
[P in keyof T | U]: P extends keyof T ? T[P] : V
}
2、Absolute 数字绝对值
ts
// https://github.com/type-challenges/type-challenges/blob/main/questions/00529-medium-absolute/README.zh-CN.md
type Absolute<T extends number | string | bigint> = `${T}` extends `-${infer U}` ? U : `${T}`
3、String to Union
ts
// https://github.com/type-challenges/type-challenges/blob/main/questions/00531-medium-string-to-union/README.zh-CN.md
type StringToUnion<T extends string> = T extends `${infer F}${infer R}` ? F | StringToUnion<R> : never
type StringToUnion<T extends string, U extends string[] = []> = T extends `${infer F}${infer R}` ? StringToUnion<R, [...U, F]> : U[number]
4、将两个类型合并成一个类型
ts
// https://github.com/type-challenges/type-challenges/blob/main/questions/00599-medium-merge/README.zh-CN.md
type Merge<F, S> = {
[P in keyof F | keyof S]: P extends keyof S ? S[P] : P extends keyof F ? F[P] : never
}
type Merge<F, S, O = F & S> = {
[P in keyof O]: P extends keyof S ? S[P] : O[P]
}
5、KebabCase 驼峰转-
ts
// https://github.com/type-challenges/type-challenges/blob/main/questions/00612-medium-kebabcase/README.md
type KebabCase<S extends string> = S extends `${infer F}${infer R}` ? R extends Uncapitalize<R> ? `${Uncapitalize<F>}${KebabCase<R>}` : `${Uncapitalize<F>}-${KebabCase<R>}` : S
6、Diff 比较两个类型不同
ts
// https://github.com/type-challenges/type-challenges/blob/main/questions/00645-medium-diff/README.zh-CN.md
type Diff<O, O1> = Omit<O & O1, keyof (O | O1)>
type Diff<O, O1> = {
[P in Exclude<keyof (O & O1), keyof (O | O1)>]: (O & O1)[P]
}
type Diff<O, O1, T = O & O1> = {
[P in keyof T as P extends keyof O ? P extends keyof O1 ? never : P : P]: T[P]
}
7、AnyOf 有一个为true就返回true
ts
// https://github.com/type-challenges/type-challenges/blob/main/questions/00949-medium-anyof/README.zh-CN.md
type AnyOf<T extends readonly any[]> = T[number] extends 0 | '' | false | [] | Record<string, never> | undefined | null ? false : true
8、IsNever 是否为never
ts
// https://github.com/type-challenges/type-challenges/blob/main/questions/01042-medium-isnever/README.md
type IsNever<T> = [T] extends [never] ? true : false
9、IsUnion 是否为联合类型
ts
// https://github.com/type-challenges/type-challenges/blob/main/questions/01097-medium-isunion/README.md
type IsUnion<T, C extends T = T> = [T] extends [never] ? false : T extends T ? [C] extends [T] ? false : true : never
type IsUnion<T, C extends T = T> = [T] extends [never] ? false : T extends T ? Exclude<C, T> extends [never] ? false : true : never
type IsUnion<T, C extends T = T> = (T extends T ? (C extends T ? true : unknown) : never) extends true ? false : true
10、ReplaceKeys
ts
// https://github.com/type-challenges/type-challenges/blob/main/questions/01130-medium-replacekeys/README.md
type ReplaceKeys<U, T, Y> = {
[P in keyof U]: P extends T ? (P extends keyof Y ? Y[P] : never) : U[P];
};
评论
0条评论
暂无内容,去看看其他的吧~