gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 20:59:47 26 4
gpt4 key购买 nike

我不确定这是 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com