utils.d.ts 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. /* 获取组件的Props类型 */
  2. export type PropsOf<T> = T extends new (...args: any) => { $props: infer P }
  3. ? P
  4. : never
  5. /* 获取函数返回值 */
  6. export type FnReturnType<T> = T extends (...args: any[]) => infer R ? R : any
  7. /* 获取函数第一个参数的类型 */
  8. export type FnParamsType<T> = T extends (arg: infer R) => any ? R : any
  9. /** 合并同名属性(覆盖式) */
  10. type MergePropertyTypes<T, U> = {
  11. [K in keyof T]: K extends keyof U ? U[K] : T[K]
  12. } & U
  13. /** 将联合类型转为交叉类型 */
  14. declare type UnionToIntersection<U> = (
  15. U extends any ? (k: U) => void : never
  16. ) extends (k: infer I) => void
  17. ? I
  18. : never
  19. /** eg: type result = StringToUnion<'abc'> 结果:'a'|'b'|'c'*/
  20. type StringToUnion<S extends string> = S extends `${infer S1}${infer S2}`
  21. ? S1 | StringToUnion<S2>
  22. : never
  23. /** 字符串替换,类似js的字符串replace方法 */
  24. type Replace<
  25. Str extends string,
  26. From extends string,
  27. To extends string,
  28. > = Str extends `${infer Left}${From}${infer Right}`
  29. ? `${Left}${To}${Right}`
  30. : Str
  31. /** 字符串替换,类似js的字符串replaceAll方法 */
  32. type ReplaceAll<
  33. Str extends string,
  34. From extends string,
  35. To extends string,
  36. > = Str extends `${infer Left}${From}${infer Right}`
  37. ? Replace<Replace<`${Left}${To}${Right}`, From, To>, From, To>
  38. : Str
  39. /** eg: type result = CamelCase<'foo-bar-baz'>, 结果:fooBarBaz */
  40. type CamelCase<S extends string> = S extends `${infer S1}-${infer S2}`
  41. ? S2 extends Capitalize<S2>
  42. ? `${S1}-${CamelCase<S2>}`
  43. : `${S1}${CamelCase<Capitalize<S2>>}`
  44. : S
  45. /** eg: type result = StringToArray<'abc'>, 结果:['a', 'b', 'c'] */
  46. type StringToArray<
  47. S extends string,
  48. T extends any[] = [],
  49. > = S extends `${infer S1}${infer S2}` ? StringToArray<S2, [...T, S1]> : T
  50. /** `RequiredKeys`是用来获取所有必填字段,其中这些必填字段组合成一个联合类型 */
  51. type RequiredKeys<T> = {
  52. [P in keyof T]: T extends Record<P, T[P]> ? P : never
  53. }[keyof T]
  54. /** `OptionalKeys`是用来获取所有可选字段,其中这些可选字段组合成一个联合类型 */
  55. type OptionalKeys<T> = {
  56. [P in keyof T]: {} extends Pick<T, P> ? P : never
  57. }[keyof T]
  58. /** `GetRequired`是用来获取一个类型中,所有必填键及其类型所组成的一个新类型的 */
  59. type GetRequired<T> = {
  60. [P in RequiredKeys<T>]-?: T[P]
  61. }
  62. /** `GetOptional`是用来获取一个类型中,所有可选键及其类型所组成的一个新类型的 */
  63. type GetOptional<T> = {
  64. [P in OptionalKeys<T>]?: T[P]
  65. }
  66. /** type result1 = Includes<[1, 2, 3, 4], '4'> 结果: false; type result2 = Includes<[1, 2, 3, 4], 4> 结果: true */
  67. type Includes<T extends any[], K> = K extends T[number] ? true : false
  68. /** eg:type result = MyConcat<[1, 2], [3, 4]> 结果:[1, 2, 3, 4]*/
  69. type MyConcat<T extends any[], U extends any[]> = [...T, ...U]
  70. /** eg: type result1 = MyPush<[1, 2, 3], 4> 结果:[1, 2, 3, 4] */
  71. type MyPush<T extends any[], K> = [...T, K]
  72. /** eg: type result3 = MyPop<[1, 2, 3]> 结果:[1, 2] */
  73. type MyPop<T extends any[]> = T extends [...infer L, infer R] ? L : never // eslint-disable-line