Typescript 从字符串参数中选择通用接口类型

Typescript 从字符串参数中选择通用接口类型,typescript,Typescript,我试图通过传递动态选择的处理程序来调用泛型函数。处理程序的参数具有与用户提供的类型字符串匹配的类型字段。我不知道如何用打字脚本来表达。如何调整类型,以便problemFunction在调用getAndUseFoo时正确设置泛型类型 我认为这个问题没有好的答案。您可以复制代码,让编译器了解不同的情况: function problemFunction(type: 'A' | 'B') { const foo = (type === 'A') ? getAndUseFoo(type,

我试图通过传递动态选择的处理程序来调用泛型函数。处理程序的参数具有与用户提供的类型字符串匹配的类型字段。我不知道如何用打字脚本来表达。如何调整类型,以便problemFunction在调用getAndUseFoo时正确设置泛型类型


我认为这个问题没有好的答案。您可以复制代码,让编译器了解不同的情况:

function problemFunction(type: 'A' | 'B') {
  const foo = (type === 'A') ? 
    getAndUseFoo(type, handlers[type]) : 
    getAndUseFoo(type, handlers[type]) ; // déjà vu
}
或使用类型不安全的:

function problemFunction(type: 'A' | 'B') {
  const foo = getAndUseFoo(type, handlers[type] as (foo:Foo)=>void); // danger
}

我已经说过,它会告诉编译器将其控制流分析分发到联合类型的值上,但是除非有很多人要求它,例如,转到那个问题并给它一个新的定义,你可以声明重载,这样,尽管代码会像你说的那样有些重复,运行时不会执行无意义的逻辑。我不知道重载如何删除错误。。。你能详细说明一下吗?我指的是函数getFootType:'A':FooA;函数getFootType:'B':FooB;但实际上还有另一种方法。函数getAndUseFootype:K,handler:typeof handlers[K]看起来不错,但如果我尝试将函数的联合问题推到getAndUseFoo的实现中,handlerfoo不被认为是安全的。此外,这允许您在没有警告的情况下调用getAndUseFootype、handlers.B,这是不安全的。。。您只希望支持类型和处理程序的匹配对。如果你认为答案比我上面所说的好,或者是一个替代方案,请随时发布你的答案和解决方案;就目前而言,我真的看不出这些建议是如何改进的,但这可能是堆栈溢出评论框的一个限制。
function problemFunction(type: 'A' | 'B') {
  const foo = getAndUseFoo(type, handlers[type] as (foo:Foo)=>void); // danger
}