繁体   English   中英

Typescript 4.4 打破元组联合推理

[英]Typescript 4.4 breaking tuple union inference

// Works fine in 4.3.5, not in 4.4.2

type ArgsTupleUnion<T> =
  | [obj: T, x: (arg: T) => void]
  | [y: (arg: number) => void];

function f<T>(...args: ArgsTupleUnion<T>) {}

f({ k: 15 }, (arg) => { // 4.3.5: arg is {k: number}, 4.4.2: arg is 'any'
  console.log(arg.k);
});

f((a: number) => {});


type ArgsTuple<T> =
  | [obj: T, x: (arg: T) => void]
  // | [y: (arg: number) => void];

function f2<T>(...args: ArgsTuple<T>) {}

f2({ k: 15 }, (arg) => { // Both 4.3.5 and 4.4.2: arg is {k: number}
  console.log(arg.k);
});

这是 TS Playground 上的代码。 我不确定是哪个更改导致它停止工作,但它阻止我升级到 4.4。 还有其他人遇到过这种情况或有解决方法的想法吗?

一种可能的解决方法是使用功能重载

打字稿似乎选择了更具体的类型编号,而不是跟踪给定数组中的元素数量。

type ArgsTuple<T> = [obj: T, x: (arg: T) => void];
type NumArrFun = [y: (arg: number) => void];

type ArgsTupleUnion<T> =
  | ArgsTuple<T>
  | NumArrFun;

function f<T>(...args: ArgsTuple<T>): void
function f<T>(...args: NumArrFun): void
function f<T>(...args: ArgsTupleUnion<T>) {}

f({ k: 15 }, (arg) => { // 4.3.5: arg is {k: number}, 4.4.2: arg is 'any'
  console.log(arg.k);
});

f((a: number) => {});

游乐场链接

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM