type Mod1State = { config: {timeout: number} }
type Mod2State = { config: {defaultSpeed: number}, speed: number }
const Mod1 = {
init(config: {timeout: number}): Mod1State {
return {
config: {
timeout: config.timeout,
}
}
}
}
const Mod2 = {
init(config: {speed: number}): Mod2State {
return {
config: {
defaultSpeed: config.speed,
},
speed: 0,
}
},
api(state: Mod2State) {
return {
speed() {
return state.speed
},
}
}
}
const RegisteredModules = {
Mod1,
Mod2,
}
function initModule<N extends keyof typeof RegisteredModules>(name: N, config: Parameters<typeof RegisteredModules[N]['init']>[0]) {
const mod = RegisteredModules[name]
const state = mod.init(config)
return {
mod,
config,
state,
}
}
export { initModule }
Gives this error inside the initModule() function, the mod.init(config) line for the config property:
Argument of type '{ timeout: number; } | { speed: number; }' is not assignable to parameter of type '{ timeout: number; } & { speed: number; }'.
Type '{ timeout: number; }' is not assignable to type '{ timeout: number; } & { speed: number; }'.
Property 'speed' is missing in type '{ timeout: number; }' but required in type '{ speed: number; }'.
Why doesn't the generic in initModule() work?
The actual code has >30 modules like Mod1 & Mod2, with slightly different sets of functions and different init parameters.
I've asked ChatGPT, but it didn't know a solution and eventually suggested to go to Typescript discord 🙂