Tengo dos tipos de funciones de filtro: NodeFilter y EdgeFilter por ejemplo type NodeFilter = (node: Node) => boolean
Me gustaría escribir una función Graph::filter(filters: NodeFilter | EdgeFilter): Graph que aplica los filtros a los nodos y bordes del Graph, para crear un nuevo Graph.
Así que en el filtro tengo que hacer
if (filter is type NodeFilter) nodes = nodes.filter(filter) else if (filter is type EdgeFilter) edges = edges.filter(filter)He visto recomendaciones de agregar una propiedad de "tipo" a las instancias. p.ej
function myNodeFilter(node: Node): boolean { // do the filtering and return boolean } myNodeFilter.type = "NodeFilter";¿Hay una mejor manera? ¿Tal vez definiendo una instancia de clase invocable?
Puede usar uniones descriminadas para esto con una pizca de firma de llamada.
/** * Kindly ignore the naming, * it was conflicting with the DOM Node and NodeFilter function (since I tested this in typescript playground) **/ type NodeF = {}; type Edge = {} type NodeFilterr = { (node: NodeF): boolean, type: "NodeFilter" } type EdgeFilter = { (edge: Edge): boolean, type: "EdgeFilter" } function f(filter: NodeFilterr | EdgeFilter ) { if ( filter.type === "NodeFilter" ) { // do stuff } if ( filter.type === "EdgeFilter" ) { // do stuff } }