【问题标题】:Function argument with two possible types in typescript打字稿中具有两种可能类型的函数参数
【发布时间】:2020-10-23 09:18:45
【问题描述】:

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

 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)

接口如下:

IntDroga:

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
    };
}

IntSolucion:

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 会标记它。

提前感谢您的帮助。

【问题讨论】:

标签: angular typescript tslint


【解决方案1】:

似乎 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
}

【讨论】:

  • 您好,谢谢您的帮助,所以在打字稿中我可以写(item: IntDroga | IntSolucion) 说该项目可以具有其中一个接口的结构,但无论如何在下面的代码中我必须继续区分代码每个案例?
  • 是的,你需要区分。考虑一下 javascript 翻译,如果在执行期间项目是 IntSolucion 的实例,则执行将抛出异常“无法读取未定义的属性值”(因为“habilitada”未定义)。如果您使用第一种方法或使用item.estado.habilitada?.value(看 ? 字符)您可能不会收到错误,但我认为 tslink 会继续标记它。
  • 明白了,我现在遇到的问题是这种方法if (item instanceof IntDroga)我得到了错误'IntDroga' only refers to a type, but is being used as a value here.ts(2693)
  • 我明白了,这是因为 IntDroga 是一个接口,而不是一个类,对吧?您不能对接口执行此操作,因为接口在编译时会被删除。也许是type guards。看看这个answer
猜你喜欢
  • 1970-01-01
  • 2020-10-29
  • 2019-02-13
  • 1970-01-01
  • 2022-06-14
  • 1970-01-01
  • 2020-11-25
  • 2022-01-23
  • 2020-12-28
相关资源
最近更新 更多