Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

utils-next.tsx 2.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. interface Props {
  2. name: string
  3. }
  4. interface Core {
  5. id: string
  6. }
  7. interface Instance extends Props, Core {}
  8. const defaults: Props = {
  9. name: "Spot",
  10. }
  11. const core: Core = {
  12. id: "0",
  13. }
  14. class ClassInstance<T extends object = {}> implements Instance {
  15. id = "0"
  16. name = "Spot"
  17. constructor(
  18. props: Partial<Props> &
  19. { [K in keyof T]: K extends keyof Core ? never : T[K] }
  20. ) {
  21. Object.assign(this, props)
  22. }
  23. }
  24. interface InstanceConstructor {
  25. new <T extends object = {}>(
  26. props: Partial<Props> &
  27. { [K in keyof T]: K extends keyof Core ? never : T[K] }
  28. ): Instance
  29. }
  30. function makeInstance<T extends object = {}>(
  31. props: Partial<Props> &
  32. { [K in keyof T]: K extends keyof Core ? never : T[K] } &
  33. ThisType<ClassInstance>
  34. ) {
  35. return new ClassInstance<T>({ ...defaults, ...props, ...core })
  36. }
  37. function getInstance<T extends object = {}>(
  38. props: Partial<Props> &
  39. { [K in keyof T]: K extends keyof Core ? never : T[K] }
  40. ) {
  41. return { ...defaults, ...props, ...core }
  42. }
  43. const instance = getInstance({
  44. name: "Steve",
  45. age: 93,
  46. wag(this: Instance) {
  47. return this.name
  48. },
  49. })
  50. interface AnimalProps {
  51. name: string
  52. greet(this: Animal, name: string): string
  53. }
  54. interface AnimalCore {
  55. id: string
  56. sleep(this: Animal): void
  57. }
  58. interface Animal extends AnimalProps, AnimalCore {}
  59. const getAnimal = <T extends object>(
  60. props: Partial<AnimalProps> &
  61. { [K in keyof T]: K extends keyof AnimalCore ? never : T[K] }
  62. ): Animal & T => {
  63. return {
  64. // Defaults
  65. name: "Animal",
  66. greet(name) {
  67. return "Hey " + name
  68. },
  69. // Overrides
  70. ...props,
  71. // Core
  72. id: "hi",
  73. sleep() {},
  74. }
  75. }
  76. const dog = getAnimal({
  77. name: "doggo",
  78. greet(name) {
  79. return "Woof " + this.name
  80. },
  81. wag() {
  82. return "wagging..."
  83. },
  84. })
  85. dog.greet("steve")
  86. dog.wag()
  87. dog.sleep()
  88. class ShapeTest {}
  89. const shapeTest = new ShapeTest()
  90. export default shapeTest
  91. type Greet = (name: string) => string
  92. const greet: Greet = (name: string | number) => {
  93. return "hello " + name
  94. }