0

Say I have a simple class class Foo {}. Under the hood with some Javascript magic, I know that a Foo object can do much more than it appears to be, which is complex enough that it cannot be expressed with an interface, but possibly with a type:

interface Bar { /* ... */ }
type Processor<T> = (value: T) => void;
type FooEx = { [K in keyof Bar as `${K & string}Processor`]: Processor<K> }

Is there a way I can say Foo "implements" FooEx, so I can use any Foo object as a FooEx? I know I can always cast/wrap it, but ideally I'd like to have it by using new Foo() and it should work out of the box.

Edit:

I'm sorry but the example above has oversimplified my question, which can be easily achieved by writing:

class Foo implements FooEx {}

so here is a more complex example:

type Processor<T> = (value: T) => void;
type FooEx<T> = { [K in keyof T as `${K & string}Processor`]: Processor<K> }

Now, this does not work:

class Foo<T> implements FooEx<T> {}
                        ~~~~~~~~
// Error: A class can only implement an object type or intersection of object types with statically known members.ts(2422)
hillin
  • 1,603
  • 15
  • 21

0 Answers0