如何在TypeScript中创建静态方法工厂

问题描述 投票:0回答:1

我正在打字稿中创建静态方法工厂函数。我在ES6中做到了。它工作正常,并得到了我期望的结果。当我在TypeScript中使用它时,存在类型转换问题。您能否解决这个问题或提出其他设计建议?

JavaScript

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

TypeScript

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')
typescript typescript-typings
1个回答
0
投票
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')

Demo

© www.soinside.com 2019 - 2024. All rights reserved.