我需要实现哪个 Typescript 功能才能在此工厂模式中具有适当的类型安全性?

Which Typescript feature do I need to implement to have proper Type safety in this Factory Pattern?

我现在已经来回浏览类型脚本文档两天了,试图找到一个可行的方法来解决我正在尝试解决的这个问题。

我在网上找到了一个非常简洁的方法,介绍了如何在将参数传递给名为“getAction”的函数时实现类型安全,并且 vscode 非常好地让我只能在“ActionA”和“ActionB”之间进行选择,但是我要解决的问题是获取相应函数的确切类型。当发送有效载荷时,这些不同的动作不会有相同的有效载荷,我需要类型安全。

我解决这个问题最深入的方法是将 return 类型作为泛型传递,但这很容易出错,因为我可能会传递错误的 return输入我选择的操作。

唯一正确的方法是以某种方式从 returned 函数中提取它。我已经尝试了很多不同的方法,我已经开始提议使用 Extract 并且在下面的代码中我硬编码了“string | number”,但这需要用某种代码代替从传递给所选 属性 的 actionTypes 的参数中提取类型,它始终是一个函数。 (actionTypes["ActionA"] //returns (param: number)=>void)。我需要提取参数的数字类型并作为预期输入值传入。

type Keys = keyof typeof actionMap
type actionTypes = typeof actionMap[Keys]

const actionA = (param: number) => {
  //does some action A
  console.log(param)
}

const actionB = (param: number) => {
  //does some action B
  console.log(param)
}

const actionMap = {
  ActionA: actionA
  ActionB: actionB
}

export class ActionFactory {
  static getAction(key: Keys): Extract<(param: string | number) => void, actionTypes> {
    return actionMap[key]
  }
}

const newAction = ActionFactory.getAction('ActionA')
newAction('Some Payload')

我是输入脚本的新手,最近才开始使用,所以也许我完全忽略了重点,但任何潜在的解决方案对我来说都很有价值!

非常感谢。

有一个非常简单的方法可以解决您的问题。如果您使用泛型类型来评估您提供给函数的键并使用它来获取 return 值,打字稿将完全能够提供 type-safety.

const actionMap = {
  ActionA: (param: number) => { },
  ActionB: (param: string) => { }
};

export class ActionFactory {
  static getAction<K extends keyof typeof actionMap>(key: K): typeof actionMap[K] {
    return actionMap[key];
  }
}

const newAction = ActionFactory.getAction('ActionA');
newAction('Some Payload'); // Error: Argument of type 'string' is not assignable to parameter of type 'number'