Javascript TypeScript:有什么技术可以中断递归条件类型推理?
我尝试键入一个函数,它接受一个参数,该参数将一系列项减少为一个累积值。以下是我所拥有内容的简化:Javascript TypeScript:有什么技术可以中断递归条件类型推理?,javascript,typescript,functional-programming,type-inference,conditional-types,Javascript,Typescript,Functional Programming,Type Inference,Conditional Types,我尝试键入一个函数,它接受一个参数,该参数将一系列项减少为一个累积值。以下是我所拥有内容的简化: //项目的存根类型 接口项{t:'Item';} 函数paginate(即使快速信息将显示类型为any),但我无法理解发生这种情况的条件 我还缺少其他技巧吗paginata()似乎效果最好,因为它至少得到了resultA的类型。有什么原因吗 这是一个需要处理的问题。正如我所说的,我认为a的特定推断来自Reducer)。编译器可能会将acc保留为类似{}、未知、或任何之类的内容,除非您像上面那样手动对
//项目的存根类型
接口项{t:'Item';}
函数paginate(即使快速信息将显示类型为any
),但我无法理解发生这种情况的条件
我还缺少其他技巧吗paginata()
似乎效果最好,因为它至少得到了resultA
的类型。有什么原因吗
这是一个需要处理的问题。正如我所说的,我认为a
的特定推断来自Reducer)。编译器可能会将acc
保留为类似{}
、未知
、或任何
之类的内容,除非您像上面那样手动对其进行注释或指定R
我有点惊讶,它没有将item
和index
分别缩小到item
和number
,而不是将它们作为any
。但可能没有太多的工作要做,因为这是一种类型推断,它不会在多个过程中发生。哦,好吧
好的,希望能有帮助。祝你好运 嗯,在我的TS3.4预览中(使用typescript@next
)对于结果
,我得到了预期的承诺
,但我在TS3.3和下面看到的是承诺
。也许就等几周吧?感谢您对类型缩小和各种权衡的深入探索!听起来您是指TypeScript 3.4中的一些特定更改,您是否介意指出您认为哪些更改可能会以我一直寻找的方式启用推断?我指的是我使用TypeScript 3.4-dev时编译器的行为,因此我不知道具体是什么更改导致它开始正确推断。看看3.3之后合并的pull请求,我发现这与泛型和上下文类型的推断有关,所以可能就是这个。但这只是一个猜测。
declare function f<T extends Something<T>>(x: T): void; // circularity error or other issue
declare function f<T>(x: T & Something<T>): void; // works now
interface Item {
t: "item";
}
type Reducer<A> = (acc: A, item: Item, index: number) => A;
type Accumulator<Reduce> = Reduce extends Reducer<infer A> ? A : never;
declare function paginateC<R extends Reducer<any>>(
reduce: R & Reducer<ReturnType<R>> // intersection here
): Promise<Accumulator<R>>;
// Promise<number> as desired
const resultC = paginateC((acc: number, item: Item, index: number) => 5);
// error, string is not number:
paginateC((x: number, y: Item, z: number)=>"string");
// okay, since string is a subtype of unknown
paginateC((x: unknown, y: Item, z: number)=>"string")
// also works with any
paginateC((x: any, y: Item, z: number)=>"string")
// acc, item, index inferred from specified R
paginateC<Reducer<number>>((acc, item, index) => 5);