Max*_*ax 14 javascript typescript
// 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);
});
Run Code Online (Sandbox Code Playgroud)
这是 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) => {});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
190 次 |
| 最近记录: |