Angular typescript中具有两种可能类型的函数参数

Angular typescript中具有两种可能类型的函数参数,angular,typescript,tslint,Angular,Typescript,Tslint,我有一个带参数的函数。此参数必须是两种接口之一。 所以我这样写: add(item: IntDroga | IntSolucion){ if(item && item.identificacion){ if(item.estado.habilitada.value == false || item.estado.estado == estadoAprobacion.Aprobado){ // some code } } } 但我收到了以下错误

我有一个带参数的函数。此参数必须是两种接口之一。 所以我这样写:

 add(item: IntDroga | IntSolucion){
  if(item && item.identificacion){
   if(item.estado.habilitada.value == false || item.estado.estado == estadoAprobacion.Aprobado){ 
    // some code
   }
  }
 }
但我收到了以下错误

    Property 'habilitada' does not exist on type '{ estado: string; habilitada: { value: boolean; viewValue: string; }; excluida: boolean; } | { estado: estadoAprobacion; fecha: Date; usuario: string; }'.
  Property 'habilitada' does not exist on type '{ estado: estadoAprobacion; fecha: Date; usuario: string; }'.ts(2339)
以下是接口:

因特拉加:

export interface IntDroga {
    _id: string;
    identificacion: {
            nombre: string,
            codigo: string,
            marca: string,
            grupoSustancias: string,
            nProducto: string,
            lote: string,
            CAS: string,
            codigoAlternativo: string,
            estandarInterno: boolean
    };
    informacion: {
            pureza: number,
            humedad: number,
            fecha: {
                    fabricacion: Date,
                    recepcion: Date,
                    vencimientoCertificado: Date,
                    vencimientoAsignada: Date,
            },
            presentacion: string,
            solucion?: { concentracion: number, unidad: string},
            cantidad: {
                    recibida: {valor: number, unidad: string},
                    remanente: {valor: number, unidad: string},
                    unidad: string,
            },
            concentracion?: {valor: number, unidad: string},
            DLDC: {
                    libre: {value: boolean, viewValue: string},
                    masaDL: number,
                    masaDC: number,
                    fDLDC: number,
            };
            sectores: string [];
            rubros: string [];
            ubicacion: string;
            observaciones: string;
    };
    estado: {
            estado: string,
            habilitada: {value: boolean, viewValue: string},
            excluida: boolean
    };
}
内溶:

export interface IntSolucion {
_id: string,
identificacion: {
    nombre: string,
    codigo: string,
},
informacion:{
    tipo: string,
    componentes: Componente [] ,
    fecha:{
        preparacion: Date,
        vencimiento: Date,
        descarte: Date
    },
    material:{
        matraz: {
            codigo: string,
            volumen: {value: number, unidad: string}
        }
    },
    temperaturaPreparacion: string,
    almacenamiento: string
    analista: string,
    solvente: {tipo: string, identificacion: string}
},
estado?: {estado:estadoAprobacion, fecha: Date, usuario: string};
};
我不知道有什么问题。假设函数的参数可以有两种不同的结构。我不知道为什么Tslink会标记它

提前感谢您的帮助。

IntSolucion似乎没有“estado”对象的属性“habilitada”。也许,您可以更改为:

add(item: IntDroga | IntSolucion){
  if(item && item.identificacion){
    if(((item instaceof IntDroga) && item.estado.habilitada.value == false) || item.estado.estado == estadoAprobacion.Aprobado) { 
     // some code
    }
  }
}
另一种方法是在以下条件下执行某些类型的操作:

if (item instanceof IntDroga) {
  // do the stuff assuming an IntDrog instance
} else {
  // do the stuff assuming an IntSolucion instance
}

你应该看看typescrit typeguard:那是因为
IntSolucion
字段
estado
中没有属性
habilitada
。您好,谢谢您的帮助,所以我可以在typescript中编写
(项目:IntDroga | IntSolucion)
表示该项可以具有其中一个接口的结构,但无论如何,在下面的代码中,我必须继续区分每种情况下的代码?是的,您需要区分。考虑javascript转换,如果在执行期间该项是IntSolucion的实例,则执行将引发异常“无法读取未定义的属性值”(因为“habilitada”未定义)。如果您使用第一种方法或使用
item.estado.habilitada.value
(查看?字符),您可能不会收到错误,但我认为tslink将继续标记它。请理解,我现在的问题是,如果(item instanceof IntDroga)我得到的错误
“IntDroga”仅指类型,但是在这里被用作一个值。ts(2693)
我明白了,这是因为IntDroga是一个接口,而不是一个类,对吗?不能对接口执行此操作,因为编译时会删除接口。也许和我一起。看看这个。