Me gusta mucho la característica del método de extensión de C#. Estaba tratando de experimentarlo en Typescript con decoradores. { originalFunction: ; { originalFunction = descriptor.value; ctr.prototype[propertyKey] = { originalFunction( , ...args); } } } export ( ) function extension ctr: any let Function return ( ) function target, propertyKey: , descriptor: PropertyDescriptor string ( ) function ...args return this Creé una fábrica de decoradores llamada . Esto toma la clase a la que queremos agregar el método. Esencialmente, lo que queremos es ejecutar este método en cualquier objeto que sea una instancia de " ". extension ctr Dado que Typescript no nos brinda un concepto de método de extensión de compilación, como solución alternativa, estamos agregando la función al prototipo de la clase pasada. { ( public name: string = 'joe', public lastname: string = 'doe' ){} } { @extension(User) test(user: User){ .log(user.name , ); } @extension(User) gaveMoney(thisArg: User, : number, : User){ .log( ); } } export class User constructor export class Extensions static console 'this works' static amount to console ` gave \$ ` ${thisArg.name} ${to.name} ${amount} user = User(); user2 = User( , ); user.gaveMoney( , user2); user2.gaveMoney( , user); const new const new 'mehmet' '' 10 20 user.test(); Como puede ver, los métodos con los que decoramos se añaden al prototipo de clase. extension User Si está recibiendo un error puede hacer una de las dos cosas siguientes: Property 'gaveMoney' does not exist on type 'User' (user any).gaveMoney( , user2); as 10 o interface User{ test; gaveMoney(n: number, :User) } export // adding the name only will fix the error u // this will give intellisense Problema Al mutar el prototipo esencialmente estamos contaminando el prototipo. Así que este truco no funcionará en o objetos. Veamos lo siguiente como ejemplo. Congelamos el class y su prototipo y obtuve un error porque nuestro método no pudo modificar la clase. frozen sealed User2 { @extension(User2) test(user: User2){ .log(user.name , ); } } { name = } .freeze(User2); .freeze(User2.prototype); sealedUser = User2(); sealedUser.test(); export class Extensions2 static console 'this works' export class User2 'john' Object Object const new Conclusión Aunque este truco funcionará para nuestro material, probablemente no funcionará en la mayoría de las bibliotecas de terceros, suponiendo que estén protegidas contra la contaminación de prototipos. La belleza de los métodos de extensión es que deberían funcionar en clases sobre las que no tenemos ningún control. Esperemos que el equipo de Typescript decida agregar esta característica increíble. ( ) https://github.com/microsoft/TypeScript/issues/9 Demostración de este artículo: https://stackblitz.com/edit/ts-ms-extension-methods-experiment?file=index.ts