Estoy tratando de escribir un tipo que actúe como una firma de función que permita tener un conjunto diferente de parámetros:
Este es el ejemplo: Enlace a TS PlaGround . También copio el código aquí por si acaso:
type T1<Tentity> = (predicate: ((entity: Tentity) => Tentity | void)) => void; type T2<TEntity> = (propertyName: keyof TEntity, newValue: unknown) => void; type TCommon<TEntity> = T1<TEntity> | T2<TEntity>; interface IEntity { name: string; surname: boolean; } const entity : IEntity = { name: 'Foo', surname: true }; const method : TCommon<IEntity> = (param1, param2) => { if (typeof(param1) === 'function') { param1(entity); } else { (entity[param1] as any)= param2; } } method('name', 'Bar'); method((entity) => { entity.name = 'Bar'});
Como puede ver, espero que ambas llamadas de method
funcionen correctamente.
Por lo que creo, TypeScript/IntelliSense debería ser lo suficientemente inteligente como para hacer este razonamiento:
function
, entonces tenemos un T1
, por lo que ni siquiera necesito el segundo parámetro.T2
, por lo que también espero un segundo parámetro.Desafortunadamente, esto no es lo que está sucediendo: parece que TypeScript no puede "creer" que param1 también puede ser una función:
Estoy bastante seguro de que esto se puede hacer porque tenemos la sobrecarga de funciones, pero solo he podido usarlos dentro de una class
. Pero básicamente es lo mismo, espero que en este caso esté definiendo el method
como una variable global.
Use una interfaz para describir un conjunto de firmas de llamada:
interface TCommon<TEntity> { (predicate: ((entity: TEntity) => TEntity | void)): void (propertyName: keyof TEntity, newValue: unknown): void; }
Pero aún no hemos terminado. El segundo parámetro es opcional en el sentido de que la primera sobrecarga no necesita un segundo parámetro, pero la segunda sobrecarga sí.
Entonces marcamos el segundo parámetro como opcional:
const method: TCommon<IEntity> = (param1, param2?: unknown) => {
Y eso es.