Endre klassetype ved å bruke en TypeScript-klasse-dekoratør


Jeg prøver å skrive en TypeScript-dekoratør som kan endre klassen den brukes på. Etter mye eksperimentering kom jeg til konklusjonen at det ennå ikke er mulig, så jeg gikk en annen vei ved å bruke en vanlig funksjon:

function component<P, T extends { props: P }, C extends { new(): T }>(cls: C) {
  return cls as C & P;
}

const Comp = component(class {
  props = {
    myOptionalString: undefined as string | undefined,
    myNumber: 5 as number,
  };

  static render(elem: typeof Comp) {
    const num: number = elem.myNumber;  // LINE 87
  }
});

const empty: typeof Comp | undefined = undefined;
const c = new Comp();
c.myOptionalString = 'hi';  // LINE 93

Men dette fungerer heller ikke:

ERROR in ./src/index.tsx
(87,30): error TS2339: Property 'myNumber' does not exist on type 'typeof (Anonymous class) & {}'.

ERROR in ./src/index.tsx
(93,3): error TS2339: Property 'myOptionalString' does not exist on type '(Anonymous class)'.

Jeg prøver i utgangspunktet å gå ruten med deklarasjonssammenslåing via &, men det fungerer ikke så langt.

Finnes det noen måte å mutere en klasse som dette på?

Svar #1

Sørg for at det står const Comp: comp<{etc}>=comp (class, etc.)

Relaterte artikler