setter中的代理属性从未键入(使用MRE)



对于TypeScript 4.5.4(当前最新版本(,此代码(请参阅下面或TypeScript操场中的内容(在版本1、2、3、4中抛出错误Type 'any' is not assignable to type 'never'.(2322),但在版本5和6中没有报告错误。如果我们移除num道具或str中的一个,那么所有错误都会消失。

这个设计有解释吗?

const myObj = {
num: -1,
arr: [1, 2, 3],
str: '',
};
const proxy = new Proxy(myObj, {
set(target, prop: keyof typeof myObj, value) {
/* none of these works */
// Ver. 1
if (prop in target) target[prop] = value;
// Ver. 2
target[prop] = value;
// Ver. 3
target[prop as keyof typeof myObj] = value;
// Ver. 4
switch (prop) {
case 'num':
case 'str':
target[prop] = value;
break;
}
/* while these works */
// Ver. 5
switch (prop) {
case 'num':
target[prop] = value;
break;
case 'str':
target[prop] = value;
break;
}
// Ver. 6
switch (prop) {
case 'num':
target[prop] = value;
break;
default:
target[prop] = value;
break;
}
return true;
},
});
console.log('proxy : ', proxy);

摘要

写在TS中产生类型交集。

详细

这是来自官方回购microsoft/TypeScript#47295的答案的副本;按照预期工作";。

在大多数设置中,prop的类型并没有从"num" | "str" | "arr"缩小;由于正在将写入target[prop],而不是从中读取,这将生成它所引用的所有可能类型的交集(而不是并集(。如果没有重叠,则该交集将塌陷为never,因为没有适用于所有类型的可能值。

创建此答案是为了结束问题。

最新更新