Given the following interface
interface MyCustomInterface {
aField: string;
}
and a library providing the following
type CommandData = Record<string, unknown>;
class Command<TData extends CommandData> {}
When creating a custom command I could go for
interface CustomCommandData extends CommandData {
aField: string;
}
class CustomCommand extends Command<CustomCommandData> {}
But there is no need for CustomCommandData
because I could simply use MyCustomInterface
instead. E.g.
class CustomCommand extends Command<MyCustomInterface> {}
The compiler tells me that's not possible because
TS2344: Type 'MyCustomInterface' does not satisfy the constraint 'CommandData'. Index signature for type 'string' is missing in type 'MyCustomInterface'.
How can I modify CustomCommandData
to
- pick all fields from
MyCustomInterface
- extend
CommandData
? I'm basically looking for something like
interface CustomCommandData extends CommandData where this extends MyCustomInterface {}
CodePudding user response:
You can use an intersection type for this.
type CustomCommandData = CommandData & MyCustomInterface;
This creates a type that is assignable to both CommandData
and MyCustomInterface
.
Side note
If you're in control of the library that defines CommandData
, there's options for that type which would prevent this kind of issue. If CommandData
was defined to be Record<string, any>
instead, MyCustomInterface
would be assignable out of the box, while still preserving the limitation to only using "object types" due to the usage of Record
.