打字稿中具有两种可能类型的函数参数
Function argument with two possible types in typescript
我有一个带参数的函数。此参数需要是两种接口之一。
所以我这样写:
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 标记它。
提前感谢您的帮助。
似乎 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
}
我有一个带参数的函数。此参数需要是两种接口之一。 所以我这样写:
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 标记它。
提前感谢您的帮助。
似乎 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
}