类型稿通用返回值推理问题

问题描述 投票:0回答:1

我不知道这是否是TS中的一个bug,或者他们认为是一个不支持的功能。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列定义的,目的是推断出Ag -grid列的参数 valueFormatter 的返回类型。valueGetter. 的参数。valueFormatter (R)推断为 unknown 的参数,但如果我明确地输入或移除 valueGetter,像这样。

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

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

javascript typescript type-inference
1个回答
1
投票

我的理解,你的代码建立了一个循环的依赖情侣。

R 可以从任何一个函数中推断,作为一个 实体型,然后作为参考来推断另一个函数签名,如果它不完整或未知。

但要做到这一点,你需要先提供至少一个实体类型,以打破这个圈子。这就是当你删除 paramvalueGetter因为你取消了TS推断param类型的请求,导致了 valueGetter 函数的一个完整的实体类型。 因此,返回类型可以作为推断类型用于 R.

如果你提供明确的类型,下面的也可以用 params: string

getColumn({
  valueFormatter: params => 'hello',
  valueGetter: (params: string) => ({
    nr: 1,
    str: 'hello',
  }),
});
© www.soinside.com 2019 - 2024. All rights reserved.