我不知道这是否是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测试过。
我的理解,你的代码建立了一个循环的依赖情侣。
R
可以从任何一个函数中推断,作为一个 实体型,然后作为参考来推断另一个函数签名,如果它不完整或未知。
但要做到这一点,你需要先提供至少一个实体类型,以打破这个圈子。这就是当你删除 param
从 valueGetter
因为你取消了TS推断param类型的请求,导致了 valueGetter
函数的一个完整的实体类型。 因此,返回类型可以作为推断类型用于 R
.
如果你提供明确的类型,下面的也可以用 params: string
getColumn({
valueFormatter: params => 'hello',
valueGetter: (params: string) => ({
nr: 1,
str: 'hello',
}),
});