我正在打字稿中创建静态方法工厂函数。我在ES6中做到了。它工作正常,并得到了我期望的结果。当我在TypeScript中使用它时,存在类型转换问题。您能否解决这个问题或提出其他设计建议?
REPL:https://repl.it/@RenjithV/NeatTepidBugs
class EventController {
static create () {
console.log('event created')
}
}
class MessageController {
static read () {
console.log('message read')
}
}
const controllers = {
'event': EventController,
'message': MessageController
}
function factory (controller, method) {
return controllers[controller][method]() // Working fine
}
const createEvent = factory('event', 'create') // event created
const readMessage = factory('message', 'read') // message read
REPL:https://repl.it/@RenjithV/EuphoricFeistyUtility
class EventController {
static create () {
console.log('event created')
}
}
class MessageController {
static read () {
console.log('message read')
}
}
const controllers = {
'event': EventController,
'message': MessageController
}
function factory (controller: string, method: string) {
return controllers[controller][method]() // How to fix this? How to create a method factory like this?
}
const createEvent = factory('event', 'create')
const readMessage = factory('message', 'read')
class EventController {
public static create () {
console.log('event created')
}
}
class MessageController {
public static read () {
console.log('message read')
}
}
type Controllers = {
event: typeof EventController
message: typeof MessageController
}
type OnlyStatic<T> = Exclude<T, 'prototype'>
const controllers: Controllers = {
'event': EventController,
'message': MessageController
}
function factory<K extends keyof Controllers, M extends OnlyStatic<keyof Controllers[K]>>(controller: K, method: M) {
return controllers[controller][method]
}
const createEvent = factory('event', 'create')
const readMessage = factory('message', 'read')