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是一个接口,而不是一个类,对吗?不能对接口执行此操作,因为编译时会删除接口。也许和我一起。看看这个。