javascript - Typescript通用返回值推断问题

标签 javascript typescript type-inference

我不确定这是 TS 中的错误还是他们认为不受支持的功能。 MVE:

interface ColumnOptions<R> {
  valueFormatter(params: R): string;
  valueGetter(params: string): R;
}

const getColumn = function<R>(options: ColumnOptions<R>) {};

getColumn({
  valueFormatter: params => 'hello',
  valueGetter: params => ({
    nr: 1,
    str: 'hello',
  }),
});

这是针对 Ag-grid 列定义,目标是推断 valueFormatter 的参数来自 valueGetter 的返回类型。在上述情况下,valueFormatter (R) 的参数被推断为unknown,但如果我显式键入或删除 valueGetter 的参数,例如这个:

getColumn({
  valueFormatter: params => 'hello',
  valueGetter: () => ({
    nr: 1,
    str: 'hello',
  }),
});

它正确推断了 R。这让我认为这可能是 TS 中的一个错误,但也许它只是不受支持,如果是这样的话,我不想在 GitHub 上打开问题。使用 TS 3.8、3.7、3.5 和 3.0 进行测试

最佳答案

据我了解,您的代码创建了一个循环依赖对。

R 可以从任一函数推断为实体实例类型,然后用作推导另一个函数签名的引用,如果它不完整或未知。

但要使其发挥作用,您需要首先提供至少一种实体类型,以打破循环。这就是当您从 valueGetter 中删除 param 时发生的情况,因为您取消了 TS 推断 param 类型的请求,从而使 valueGetter 函数呈现为完整的固体类型。因此,返回类型可以用作 R 的推断类型。

如果您为 params: string 提供显式类型,则以下内容也适用

getColumn({
  valueFormatter: params => 'hello',
  valueGetter: (params: string) => ({
    nr: 1,
    str: 'hello',
  }),
});

关于javascript - Typescript通用返回值推断问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61385295/

相关文章:

TypeScript - 声明与导出 - 最佳实践?

node.js - 在 Mocha 测试之间重新导入模块

rust - 在 `as_ref()` 中使用 `assert_eq!()` 时需要类型注解

javascript - 检查 JavaScript 数组中是否存在值

javascript - Angular $http.post then 方法不起作用

reactjs - 如何在功能组件中的 React props 中使用泛型?

java - 为什么 Java 泛型类型推断会在链式方法调用中中断?

datetime - F#,小类型推断/注释错误

javascript - 如何在 Express 中路由动态 URL

javascript - Angular 模块名称全局声明和重用