我需要实现哪个 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'
我现在已经来回浏览类型脚本文档两天了,试图找到一个可行的方法来解决我正在尝试解决的这个问题。
我在网上找到了一个非常简洁的方法,介绍了如何在将参数传递给名为“getAction”的函数时实现类型安全,并且 vscode 非常好地让我只能在“ActionA”和“ActionB”之间进行选择,但是我要解决的问题是获取相应函数的确切类型。当发送有效载荷时,这些不同的动作不会有相同的有效载荷,我需要类型安全。
我解决这个问题最深入的方法是将 return 类型作为泛型传递,但这很容易出错,因为我可能会传递错误的 return输入我选择的操作。
唯一正确的方法是以某种方式从 returned 函数中提取它。我已经尝试了很多不同的方法,我已经开始提议使用 ExtractactionTypes["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'