首页 > 解决方案 > 可以是多键打字稿之一的类型

问题描述

我有一个界面

 interface Test {
   property: SpecialProperty;
 }

现在SpecialProperty可以是每个之一:


export type SpecialProperty= {
      withPropA: PropA;
    }
  | {
      withPropB: PropB;
    }
  | {
      withPropC: PropC;
    }

不能有withPropA和其他财产等..

问题是编译器不允许我这样做。

如果我做


function(param: Test ) {
 if(param.property.withPropA) {
   const prop:PropA = param.property.withPropA;
 }
 if(param.property.withPropB) {
   const prop:PropB = param.property.withPropB;
 }

}

编译器说

类型 '{ withPropB: PropB; 上不存在属性 'withPropA' }'。

我试过铸造等......但没有

标签: typescript

解决方案


您需要使用属性存在检查来缩小类型param.property而不是真实性检查:

function example(param: Test ) {
    if ("withPropA" in param.property) {                  // ***
        const prop:PropA = param.property.withPropA;
    }
    if ("withPropB" in param.property) {                  // ***
        const prop:PropB = param.property.withPropB;
    }
}

游乐场链接

您的真实性检查要求您读取该属性的值,但是当您要求它这样做时,TypeScript 并不知道该对象是否具有该属性。

更多在这里。据说该页面现在已被弃用,取而代之的是该页面,但新页面并未涵盖此特定检查(然而,新页面是全新的)。


推荐阅读