i esas interfaces:
export interface EventCollectorData { eventType: EventCollectorType; } export interface ClickEventCollectorData extends EventCollectorData { elementData: EventCollectorElementLocator; eventType: EventCollectorType.CLICK; } export interface NetworkEventCollectorData extends EventCollectorData { eventType: EventCollectorType.REQUEST; requestData: { method: NetworkMethod; url: string; headers: Object; body: { json: Object | null; text: string | null; formData: any; }; }; } export type EventCollectorDataType = ClickEventCollectorData | NetworkEventCollectorData; Cuando quiero usar EventCollectorDataType y verificar si elementData o requestData , recibo este error:
La propiedad 'elementData' no existe en el tipo 'EventCollectorDataType'. La propiedad 'elementData' no existe en el tipo 'NetworkEventCollectorData'.
Aquí hay un ejemplo para la función que quiero hacer esta verificación:
const check = (eventCollector: EventCollectorDataType) { if (eventCollector.elementData) { } else if (eventCollector.requestData) { } }¿Cómo puedo implementar algo así?
Debe reducir el tipo con el que está tratando antes de acceder a las propiedades que solo existen en una parte de la unión. Por la forma en que configuró las cosas, la propiedad eventType es perfecta para esto (forma una unión discriminada ), por lo que recomiendo lo siguiente:
const check = (eventCollector: EventCollectorDataType) { if (eventCollector.eventType === EventCollectorType.CLICK) { // do stuff with eventCollector.elementData } else if (eventCollector.eventType === EventCollectorType.REQUEST) { // do stuff with eventCollector.requestData } }Una forma alternativa de reducirlo sería así:
if ('elementData' in eventCollector) { } else if ('requestData' in eventCollector) { }