javascript - Διατήρηση της πληκτρολόγησης συναρτήσεων κατά την επέκταση ενός αντικειμένου στο Typescript


Χρειάζομαι να εκτελέσω μερικούς μετασχηματισμούς σε ένα αντικείμενο TypeScript ενώ ταυτόχρονα να μπορώ να διατηρήσω ολόκληρο το σχήμα του.

Λοιπόν, έχω ένα αντικείμενο:

const simpleObject = {
  one: () => ({}),
  two: (a: number) => ({ a }),
};

type SimpleObject<K, V> = {
  [P in keyof K]: V; // Not sure how to type V correctly to be a function that takes any arguments and outputs an object
};

όπου οι τιμές είναι γενικές συναρτήσεις που επιστρέφουν ένα αντικείμενο.

Χρειάζεται να πραγματοποιήσω μερικές μετατροπές στο αντικείμενο, έτσι ώστε:

type AugmentedObject<K, V> = {
  [P in keyof K]: V; // again, typing of V is not correct here, it should be a generic function that outputs an object
};

function augmentObject<K, V>(simpleObject: SimpleObject<K, V>): AugmentedObject<K, V> {
  // perform some transformation
  // ...
  return simpleObject;
}

augmentObject(simpleObject).one; // the type should resolve to a () => object
augmentObject(simpleObject).two; // the type should resolve to (a: number) => object

Δεν μπορώ να καταλάβω πώς να διατηρήσω τον σωστό τύπο για το one ή το two καθώς δεν μπορώ να καταλάβω πώς να περάσω μια συνάρτηση γενικά

Απάντηση #1

Δεν είμαι σίγουρος ότι αυτή είναι η λύση που ψάχνετε. Παρόλο που οι τελικοί τύποι έχουν ακριβώς το σχήμα που περιμένετε.

const simpleObject = {
  one: () => ({}),
  two: (a: number) => ({ a }),
};

type SimpleObject
  = { [K in string | number | symbol]: (...args: any[]) => object }

function augmentObject<T extends SimpleObject>(simpleObject: T): T {
  // perform some transformation
  // ...
  return simpleObject;
}

const a = augmentObject(simpleObject)

type One = typeof a.one  // type One = () => {}
type Two = typeof a.two  // type Two = (a: number) => { a: number }

Παιδική χαρά TS