GlassBricks / typed-factorio

Complete and featureful Typescript defintions for the Factorio modding API
MIT License
33 stars 3 forks source link

Typechecked CustomEventName #21

Closed Dimava closed 8 months ago

Dimava commented 9 months ago
// lib side:
declare module 'factorio:common' {
  export interface CustomEventMap {}
  // just `string` if not used
  export type CustomEventName = [keyof CustomEventMap] extends [never] ? string : keyof CustomEventMap
}
declare module 'factorio:runtime' {
  export interface LuaBootstrap {
    on_event(event: import('factorio:common').CustomEventName, f: ((data: CustomInputEvent) => void) | nil): void
  }
}
declare module 'factorio:prototype' {
  export interface CustomInputPrototype {
    name: import('factorio:common').CustomEventName
  }
}
// user side:
declare module 'factorio:common' {
  export interface CustomEventMap {
    'dish-kruise-run': true
  }
}
data.extend<CustomInputPrototype>([{
  name: 'dish-kruise-run', // <-- typechecked & autocompleted
  type: 'custom-input',
  key_sequence: 'mouse-button-3',
}])
script.on_event(
  'dish-kruise-run', // <-- typechecked & autocompleted
  () => {},
)
GlassBricks commented 8 months ago

Explaining this in words, the idea is to introduce a CustomEventMap interface that optionally can extend to provide type checking for custom event names.

This looks useful; I'll likely add it in the next version.

GlassBricks commented 8 months ago

Released in v2.6.0.