Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript TypeScript:有什么技术可以中断递归条件类型推理?_Javascript_Typescript_Functional Programming_Type Inference_Conditional Types - Fatal编程技术网

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);