Tengo la siguiente función que toma cualquiera de los 3 tipos que comparten 1 propiedad en común, pero sus otras propiedades varían:
private async processPredicates( routing: ActivityRouting[] | ActivityStepOptionsOverride[] | ActivityStepContentSource[] ) { for (const { predicate, ...block } of routing) { if (predicate == null) return block; else if (await this.callMethod(PREDICATES, predicate)) return block; } return null; } La propiedad que comparten los 3 tipos se llama predicate
export type ActivityRouting = { predicate?: string[]; sideEffects?: SideEffect[]; next?: Next; }; export type ActivityStepOptionsOverride = { mode?: string; predicate?: string[]; }; export type ActivityStepContentSource = { reduce?: string; use?: string; predicate?: string[]; };Ahora, aquí está mi problema: después de agregar el segundo y tercer tipo a processPredicates, la siguiente función comenzó a darme 2 errores:
private async resolveRouting({ routing, step, options, defaultNext, }: { routing?: ActivityRouting[]; step: ActivityStep; options: ActivityStepOptions; defaultNext: Next; }) { await StepEvaluationContext.evaluate({ controller: this, step, options }, async () => { const leftoverRouting = routing && (await this.processPredicates(routing)); if (leftoverRouting && leftoverRouting.sideEffects) { await Promise.all( leftoverRouting.sideEffects.map( async (sideEffect) => await this.callMethod(SIDE_EFFECTS, sideEffect) ) ); } await this.callMethod(STEP_RESOLVERS, leftoverRouting?.next ?? defaultNext); }); }Los errores son:
Property 'sideEffects' does not exist on type '{ sideEffects?: SideEffect[] | undefined; next?: Next | undefined; } | { reduce?: string | undefined; use?: string | undefined; } | { mode?: string | undefined; }'. Property 'sideEffects' does not exist on type '{ reduce?: string | undefined; use?: string | undefined; }'.ts(2339)Y
Property 'next' does not exist on type '{ sideEffects?: SideEffect[] | undefined; next?: Next | undefined; } | { reduce?: string | undefined; use?: string | undefined; } | { mode?: string | undefined; }'. Property 'next' does not exist on type '{ reduce?: string | undefined; use?: string | undefined; }'.ts(2339) Me imagino que el error proviene del hecho de que la función resolveRouting no sabe cuál de los 3 tipos leftoverRouting , por lo que simplemente me dice que la propiedad no existe. Sin embargo, no estoy muy seguro de cómo manejar ese problema.
El problema es que el tipo de retorno de la función processPredicates tiene la unión de los 3 tipos. No es posible acceder a leftoverRouting.sideEffects sin un tipo que lo restrinja .
Para resolverlo, haga que processPredicates sea una función genérica que devuelva el tipo que se llama en su lugar. Sería el siguiente:
interface Activity { predicate?: string[]; } export interface ActivityRouting extends Activity { sideEffects?: string[]; next?: string; }; export interface ActivityStepOptionsOverride extends Activity { mode?: string; }; export interface ActivityStepContentSource extends Activity { reduce?: string; use?: string; }; async function processPredicates<T extends Activity>( routing: T[] ): Promise<Omit<T, 'predicate'> | null> { for (const { predicate, ...block } of routing) { if (predicate == null) return block; else if (await this.callMethod(PREDICATES, predicate)) return block; } return null; }