Advertisement
Guest User

Untitled

a guest
Apr 24th, 2019
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.75 KB | None | 0 0
  1. import { AssertTrue, Has, IsExact } from "conditional-type-checks";
  2.  
  3. // interface A<T1 extends { [key: string]: any }, T2 extends T1> {
  4. // a: T1;
  5. // // b: (keyof T2)[]; // 現実解
  6. // b: Workaround<keyof T2>[]; // 現実解
  7. // // b: TupleAtMost3<T2>; // 重複を防ぐようにするにはすべての組み合わせを列挙する?
  8. // }
  9.  
  10. // interface A<T1 extends { [key: string]: any }, T2 extends T1> {
  11. interface A<T extends { [key: string]: any }, Keys extends (keyof T)[]> {
  12. a: T;
  13. // b: (keyof T2)[]; // 現実解
  14. // b: Workaround<keyof T2>[]; // 現実解
  15. b: Keys; // 現実解
  16. }
  17.  
  18. // type Workaround<K> = K[] & { length: 1 };
  19.  
  20. // declare function f<T1 extends { [key: string]: any }, T2 extends T1>(
  21. declare function f<T extends { [key: string]: any }, Keys extends (keyof T)[]>(
  22. obj: A<T, Keys>
  23. ): A<T, Keys>;
  24.  
  25. const a = f({ a: { c: 1, d: 2 }, b: ["c", "d"] });
  26. const b = f({ a: { c: 1, d: 2 }, b: ["x"] });
  27. const c = f({ a: { x: 1 }, b: ["x"] });
  28. const d = f({ a: { x: 1 }, b: ["x", "x"] });
  29. const e = f({ a: { x: 1, y: 2 }, b: ["x", "y"] });
  30. const g = f({ a: { x: 1, y: 2 }, b: ["x", "y", "z"] });
  31. const h = f({ a: { x: 1, y: 2 }, b: ["x"] });
  32. const i = f({ a: { x: 1, y: 2 }, b: ["x", "x"] });
  33. const j = f({ a: { x: 1, y: 2, z: 3 }, b: ["x"] });
  34.  
  35. interface V<MInput extends any, MOutput extends MInput> {
  36. data(): MInput extends any ? MInput : never;
  37.  
  38. methods: { [key: string]: (this: { readonly $state: MOutput }) => void };
  39. }
  40.  
  41. declare function v<M1 extends any, M2 extends M1>(obj: V<M1, M2>): V<M1, M2>;
  42.  
  43. const component = v({
  44. data() {
  45. return { a: 1 };
  46. },
  47. methods: {
  48. a() {
  49. this.$state;
  50. }
  51. }
  52. });
  53.  
  54. type C<First, Rest> = [First, ...Rest[]];
  55. const cc: C<string, number> = ["1", 1, 2];
  56. declare const ddd: keyof typeof cc;
  57. declare const eee: keyof [];
  58.  
  59. // [] | ["0"] | ["0", "1"] | ["1", "0"]
  60.  
  61. // type CCC = [] | [...("0" | "1")[]];
  62. type DDD<T extends [...string[]]> = T extends { length: 0 }
  63. ? []
  64. : T extends { length: 1 }
  65. ? [] | ["0"]
  66. : T extends { length: 2 }
  67. ? [] | ["0"] | ["1"] | ["0", "1"] | ["1", "0"]
  68. : never;
  69.  
  70. namespace TypeChecks {
  71. type doTest0 = AssertTrue<IsExact<DDD<[]>, []>>;
  72. type doTest1 = AssertTrue<Has<DDD<["a"]>, ["0"]>>;
  73. }
  74.  
  75. // type Hoge<Union> = Union extends infer T1 | infer T2 ? T1 : never;
  76.  
  77. // type TupleAtMost2<
  78. // Union
  79. // > = /*Union[] extends (infer T1 | infer T2 | infer T3)[]
  80. // ? [T1, T2, T3]
  81. // :*/ Union[] extends (
  82. // | infer T1
  83. // | infer T2)[]
  84. // ? [T1, T2]
  85. // : Union extends infer T
  86. // ? [T]
  87. // : never;
  88.  
  89. type TupleAtMost2<
  90. Union
  91. > = /*Union[] extends (infer T1 | infer T2 | infer T3)[]
  92. ? [T1, T2, T3]
  93. :*/ Union[] extends (
  94. | infer T1
  95. | infer T2)[]
  96. ? [T1, T2]
  97. : Union extends infer T
  98. ? [T]
  99. : never;
  100.  
  101. type AAAAA<T, K extends keyof T> = K extends keyof T ? [Pick<T, K>] : never;
  102.  
  103. type BBBBB<T, K extends keyof T> = K extends keyof T ? never : never;
  104.  
  105. type KnownKeys<T> = {
  106. [K in keyof T]: string extends K ? never : number extends K ? never : K
  107. } extends { [_ in keyof T]: infer U }
  108. ? ({} extends U ? never : U)
  109. : never;
  110.  
  111. // union distribution + not distributed
  112.  
  113. // type TupleAtMost2<U> = Sub<U>;
  114.  
  115. type Sub1<T, K extends keyof T = keyof T> = K extends keyof T
  116. ? Pick<T, Exclude<keyof T, K>>
  117. : never;
  118.  
  119. type Subs<
  120. T,
  121. K1 extends keyof T = keyof T,
  122. K2 extends keyof T = keyof T,
  123. K3 extends keyof T = keyof T,
  124. K4 extends keyof T = keyof T,
  125. K5 extends keyof T = keyof T,
  126. K6 extends keyof T = keyof T,
  127. K7 extends keyof T = keyof T,
  128. K8 extends keyof T = keyof T
  129. > = K1 extends keyof T
  130. ? K2 extends keyof T
  131. ? K3 extends keyof T
  132. ? K4 extends keyof T
  133. ? K5 extends keyof T
  134. ? K6 extends keyof T
  135. ? K7 extends keyof T
  136. ? K8 extends keyof T
  137. ? Pick<
  138. T,
  139. Exclude<keyof T, K1 | K2 | K3 | K4 | K5 | K6 | K7 | K8>
  140. >
  141. : never
  142. : never
  143. : never
  144. : never
  145. : never
  146. : never
  147. : never
  148. : never;
  149.  
  150. namespace TypeChecks {
  151. type doTest0 = AssertTrue<IsExact<DDD<[]>, []>>;
  152. type doTest1 = AssertTrue<Has<DDD<["a"]>, ["0"]>>;
  153. }
  154.  
  155. // type AtLeastOne<T> = Spread<T, keyof T>;
  156. // type Spread<T, K extends keyof T> = K extends keyof T
  157. // ? PartiallyPartial<T, Exclude<keyof T, K>>
  158. // : never;
  159. // type PartiallyPartial<T, K extends keyof T> = Partial<Pick<T, K>> &
  160. // Pick<T, Exclude<keyof T, K>>;
  161.  
  162. // negate type?
  163. // type A<Union> = { 0: Union[0], 1: Union[1] }
  164.  
  165. // type Target = { a: number; b: number; c: number; d: number };
  166. type Target = { a: number; b: number; c: number };
  167. type Middle = Subs<Target> | Target;
  168.  
  169. const m: Middle = {};
  170.  
  171. type SubsAlpha<
  172. T,
  173. K1 extends keyof T = keyof T,
  174. K2 extends keyof T = keyof T,
  175. K3 extends keyof T = keyof T
  176. > = K1 extends keyof T
  177. ? K2 extends keyof T
  178. ? K3 extends keyof T
  179. ? (K1 extends K2
  180. ? (/* K1 == K2, then */ K2 extends K3
  181. ? /* K1 == K2 == K3, so */ [K1]
  182. : /* K1 == K2 != K3, so */ [K1, K3])
  183. : /* K1 != K2, then */ K2 extends K3
  184. ? never
  185. : /* K1 != K2 && K2 != K3, then */ K3 extends K1
  186. ? never
  187. : /* K1,K2,K3 are distinguish, so */ [K1, K2, K3])
  188. : never
  189. : never
  190. : never;
  191.  
  192. type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
  193.  
  194. type SubsBeta<
  195. T,
  196. Keys extends any[] = [],
  197. NewKey extends keyof T = keyof T
  198. > = Exclude<T, Keys[number]> extends never
  199. ? never
  200. : NewKey extends keyof T
  201. ? { 1: NewKey; 0: SubsBeta<Omit<T, NewKey>, [NewKey]> }
  202. : never;
  203.  
  204. // type SubBeta_<T, Keys extends any[] = [], NewKey extends keyof T = keyof T> = SubsAlpha<T, NewKey>;
  205.  
  206. type MiddleAlpha = [] | SubsAlpha<Target>;
  207. type MiddleBeta = [] | SubsBeta<Target>;
  208. type TupleAtMost3<T> = [] | SubsAlpha<T>;
  209.  
  210. const wewrq: { "0": 1 } = [1];
  211.  
  212. type UnionToTuple<U> = UnionToTupleRecursively<[], U>;
  213.  
  214. type UnionToTupleRecursively<T extends any[], U> = {
  215. 1: T;
  216. 0: Math;
  217. }[[U] extends [never] ? 1 : 0];
  218.  
  219. type ASSS = UnionToTuple<"a" | "b">;
  220.  
  221. type Values<T> = T extends { [index: number]: infer E } ? E : never;
  222.  
  223. const aaa = ["a", "b"] as const;
  224.  
  225. type As = Values<typeof aaa>;
  226.  
  227. // type A2<T1 extends { [key: T2[number]]: any }, T2 extends string[]> = T2 extends (infer T3)[] ? {
  228. // a: T1;
  229. // b: T3;
  230. // } : never;
  231. //
  232. // declare function f2<T1 extends { [key: string]: any }, T2>(
  233. // obj: A2<T1, T2>
  234. // ): A2<T1, T2>;
  235. //
  236. // const a2 = f2({ a: { c: 1, d: 2 }, b: ["c", "d"] as const });
  237. // const b2 = f2({ a: { c: 1, d: 2 }, b: ["x"] as const });
  238. // const c2 = f2({ a: { x: 1 }, b: ["x"] });
  239. // const d2 = f2({ a: { x: 1 }, b: ["x", "x"] });
  240. // const e2 = f2({ a: { x: 1, y: 2 }, b: ["x", "y"] });
  241. // const g2 = f2({ a: { x: 1, y: 2 }, b: ["x", "y", "z"] });
  242. // const h2 = f2({ a: { x: 1, y: 2 }, b: ["x"] });
  243. // const i2 = f2({ a: { x: 1, y: 2 }, b: ["x", "x"] });
  244. // const j2 = f2({ a: { x: 1, y: 2, z: 3 }, b: ["x"] });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement