gpt4 book ai didi

TypeScript:将对象放入变量时,类型保护不适用于 switch 语句

转载 作者:搜寻专家 更新时间:2023-10-30 21:08:10 26 4
gpt4 key购买 nike

我不明白为什么类型保护在下面的例子中不起作用......

当我们拥有这些接口(interface)时,

interface ParamA {
name: 'A';
aaa: boolean;
}

interface ParamB {
name: 'B';
bbb: number;
}

function func(param: ParamA | ParamB) {
switch (param.name) {
case 'A':
const aaa = param.aaa;
console.log(aaa); // boolean
break;
case 'B':
const bbb = param.bbb;
console.log(bbb); // number
break;
default:
break;
}
}

不好

function func(param: ParamA | ParamB) {
const name = param.name; // just rewrite here
switch (name) {
case 'A':
const aaa = param.aaa;
// ^^^
console.log(aaa);
break;
case 'B':
const bbb = param.bbb;
// ^^^
console.log(bbb);
break;
default:
break;
}
}

编译器会抛出类似 Property 'aaa' does not exist on type 'ParamB' 的错误。 我认为是否可以将其放入变量中在行为上应该没有差异。

使用的TypeScript版本是2.8.3。

谁能解释一下?

最佳答案

2021-08 更新:

Typescript 4.4变得更聪明,你的例子开箱即用:-)

旧答案

将属性分配给变量会失去与对象的连接。这对于编译器来说很难遵循,因为您可以独立更改字符串和对象变量:

var param: ParamA | ParamB;
param = someParamA;
const name = param.name;
param = someParamB;
switch (name) { // boom

因此,如果您确定您没有更改变量,则可以使用类型断言,但出于维护原因我不会这样做。

关于TypeScript:将对象放入变量时,类型保护不适用于 switch 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50403313/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com