以下是我遇到的问题的一个非常简单的表示.

function func1(arg1: string) {
  return arg1
}

function func2(arg1: number, arg2: string) {
  return arg2
}

function selector<Determiner extends boolean>(
  useFunc1Type: Determiner,
  func: Determiner extends true ? typeof func1 : typeof func2
) {
  if (useFunc1Type) {
    func() // arg1 is inferred as 'never', shouldn't it be 'string'
  }
}

我需要根据值useFunc1Type使用适当的参数调用func,但我无法让编译器缩小func的类型.因为两个函数(stringnumber)的第一个参数的类型之间没有重叠,所以它一直将第一个参数推断为‘Never’.我以为用if块就行了,但事实并非如此.在这种情况下我能做什么呢?

如果有什么不同的话,我使用的是TypeScripv5.1.6.

推荐答案

似乎尽管是在V5中,TypeScrip在类型推断方面仍然有很大的问题.我不得不拆分成多个重载,并使用打字保护.

function func1(arg1: string) {
  return arg1
}

function func2(arg1: number, arg2: string) {
  return arg2
}

function selector(useFunc1Type: true, func: typeof func1): void;
function selector(useFunc1Type: false, func: typeof func2): void;

function selector(
  useFunc1Type: boolean,
  func: typeof func1 | typeof func2
): void {
  const isFunc1 = (fn: typeof func): fn is typeof func1 => useFunc1Type;

  if (isFunc1(func)) {
    func("properly 'inferred'");
  }
}

Typescript相关问答推荐

TS不推断类型在条件判断后具有属性'

在动态对话框中使用STEP组件实现布线

路由链接不会导航到指定router-outlet 的延迟加载模块

在包含泛型的类型脚本中引用递归类型A<;-&B

角效用函数的类型推断

是否存在类型联合的替代方案,其中包括仅在某些替代方案中存在的可选属性?

ApexCharts条形图未显示最小值.负值

尽管对象的类型已声明,但未解析的变量<;变量

vue-tsc失败,错误引用项目可能无法禁用vue项目上的emit

为什么上下文类型在`fn|curred(Fn)`的联合中不起作用?

S,为什么我的T扩展未定义的条件在属性的上下文中不起作用?

如何键入并类型的函数&S各属性

在Thunk中间件中输入额外参数时Redux工具包的打字脚本错误

创建一个函数,该函数返回一个行为方式与传入函数相同的函数

如何在Nextjs路由处理程序中指定响应正文的类型

字符串文字联合的分布式条件类型

为什么TypeScrip假定{...省略类型,缺少类型,...选取类型,添加&>}为省略类型,缺少类型?

如何在Deno中获取Base64图像的宽/高?

为什么 Typescript 无法正确推断数组元素的类型?

在Typescript 中,是否有一种方法来定义一个类型,其中该类型是字符串子集的所有可能组合?