-
Notifications
You must be signed in to change notification settings - Fork 44
Description
It seems that currently, you can't apply an interface to members of the built-in Memory objects (such as Memory.creeps) because they're defined in index.d.ts as any. I'd like to propose making a dummy interface for each of the four built-in Memory objects so that a player can then extend those interfaces in their own definition files.
For example, say I make my own interface for a room's memory:
interface MemRoom {
name: string;
type: string;
threat: boolean;
}If I try to apply it to Memory as follows:
interface Memory {
rooms: {
[name: string]: MemRoom;
};
}Then with the current typings I will get this error:
error TS2403: Subsequent variable declarations must have the same type. Variable 'rooms' must be of type '{ [name: string]: any; }', but here has type '{ [name: string]: MemRoom; }'.
If however, there were already a "dummy" interface in the typings called MemRoom:
interface Memory {
[name: string]: any;
...
rooms: {
[name: string]: MemRoom;
};
...
}
interface MemRoom {
[name: string]: any;
}
declare class Room {
...
/**
* A shorthand to Memory.rooms[room.name]. You can use it for quick access the room’s specific memory data object.
*/
memory: MemRoom;
...
}Then I could extend MemRoom to give specific types to any variables I want (as I tried to do above). This could be done for all four default Memory objects, and would allow users to type things that they want to store in memory - a huge advantage, I think, since Memory is the biggest source of errors for me these days!
If there is already a way to accomplish this that doesn't require modifying the current screeps declarations, please let me know as I'd be very curious!