Advertisement
Guest User

Untitled

a guest
Aug 17th, 2019
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.75 KB | None | 0 0
  1. interface Options {
  2. type: "boolean" | "number" | "string" | "array";
  3. }
  4.  
  5. type InferredOptionType<O extends Options> =
  6. O extends { type: "array" } ? Array<string | number> :
  7. O extends { type: "boolean" } ? boolean :
  8. O extends { type: "number" } ? number :
  9. O extends { type: "string" } ? string :
  10. unknown;
  11.  
  12. type Result<T = {}> = T & {
  13. [key: string]: unknown
  14. }
  15.  
  16. class OBJ<T> {
  17.  
  18. add<K extends string, O extends Options>(key: K, options: O) {
  19. return new OBJ<T & { [key in K]: InferredOptionType<O> }>()
  20. }
  21.  
  22. get result() {
  23. return {} as { [key in keyof Result<T>]: Result<T>[key] }
  24. }
  25.  
  26. }
  27.  
  28. const obj = new OBJ()
  29.  
  30. obj
  31. .add('foo', {
  32. type: 'array'
  33. })
  34. .add('bar', {
  35. type: 'string'
  36. })
  37. .add('test', {
  38. type: 'number'
  39. })
  40. .result
  41. .bar
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement