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
为什么受歧视的union typescript不';不行?_Typescript - Fatal编程技术网

为什么受歧视的union typescript不';不行?

为什么受歧视的union typescript不';不行?,typescript,Typescript,我有这些类型 type TARGET\u EDIT\u SKILL={ “技能”部分; 属性:'类型'; 指标:数量; foobar:字符串; }; 类型目标\编辑\体验={ “经验”一节; 属性:“时间”|“位置”|“名称”|“摘要”; 指标:数量; }; 类型操作\u编辑\u节={ 类型:编辑部分的类型; 有效载荷:{ 目标:目标编辑技能、目标编辑经验; 值:字符串; }; }; 导出类型操作= |操作\u更新\u数据 |操作\编辑\标题 |动作编辑技巧 |行动(编辑)部分;; 然后在减速

我有这些类型

type TARGET\u EDIT\u SKILL={
“技能”部分;
属性:'类型';
指标:数量;
foobar:字符串;
};
类型目标\编辑\体验={
“经验”一节;
属性:“时间”|“位置”|“名称”|“摘要”;
指标:数量;
};
类型操作\u编辑\u节={
类型:编辑部分的类型;
有效载荷:{
目标:目标编辑技能、目标编辑经验;
值:字符串;
};
};
导出类型操作=
|操作\u更新\u数据
|操作\编辑\标题
|动作编辑技巧
|行动(编辑)部分;;
然后在减速器中

case actions.EDIT_部分:{
const{target,value}=action.payload;
const{section,property,index}=target;
如果(部分==‘技能’){
console.log(target.foobar);
返回属性=='time';
}
...
}
但我得到了typescript错误“属性'foobar'在类型'TARGET\u EDIT\u EDUCATION'上不存在”。为什么?我想如果我用截面条件缩小类型,那么foobar肯定存在。为什么
returnproperty==='time'不是类型
从不
<代码>时间
在带有“技能”部分的类型上不存在

--编辑

还有一件事,我有

const newSetion = [...state[target.section]];
// const newSection: (Skill | Education | Experience | Language)[]

为什么它说
属性“type”在类型“Skill | Experience | Education | Language”上不存在。
如果它已经知道
newSection
状态。skills
和Property
type
在那里存在。

您已经将对象拆分为独立的局部变量,因此,类型之间不再有联系。检查局部变量
部分的类型对
目标的类型没有影响。您和我可能能够看到这种关系,但typescript无法回溯到类型是如何产生的,然后计算其他变量的所有结果

要缩小
target
的类型,需要检查
target
上的属性,如中所示:

if (target.section === 'skills') {
  // now the type on target has been narrowed
  console.log(target.foobar)
}
虽然我相信您会遇到另一个问题,
section
不会出现在您的联合体中所有可能的类型上,因此typescript将不允许您访问
target.section
。因此,您需要:

if ('section' in target && target.section === 'skills) {

您已将对象拆分为独立的局部变量,因此类型之间不再存在链接。检查局部变量
部分的类型对
目标的类型没有影响。您和我可能能够看到这种关系,但typescript无法回溯到类型是如何产生的,然后计算其他变量的所有结果

要缩小
target
的类型,需要检查
target
上的属性,如中所示:

if (target.section === 'skills') {
  // now the type on target has been narrowed
  console.log(target.foobar)
}
虽然我相信您会遇到另一个问题,
section
不会出现在您的联合体中所有可能的类型上,因此typescript将不允许您访问
target.section
。因此,您需要:

if ('section' in target && target.section === 'skills) {

如果您将其作为
target.section==“skills”
,它是否会改变?请提供可复制的示例这是否回答了您的问题?请提供一份报告。确保它是完整的,并且提到了所有相关类型,如
Skill
和其他类型。另外,请在一个问题中只关注一个问题。如果您将其作为
target.section==“skills”
,它是否会改变?请提供可复制的示例这是否回答了您的问题?请提供一份报告。确保它是完整的,并且提到了所有相关类型,如
Skill
和其他类型。另外,请在一个问题中只关注一个问题。请检查Edit@MateuszPiguła请在一个问题中只关注一个问题/错误。请检查Edit@MateuszPiguła请在一个问题中只关注一个问题/错误。