En Typescript/Javascript, dada la clase:
class T { method_a() { console.log('Inside method a'); } } Necesito acceder al método (ilimitado) de esta manera, pero en su lugar no está undefined :
const method_to_be_passed = T.method_a; // undefinedEn python, obtendría el método independiente así:
class P: def method_a(): print('inside method a') the_method = P.method_a # <function P.method_a at 0x7fee48eff310>Y luego puedo vincularlo a un objeto para llamarlo. ¿Cómo haría el equivalente en TS/JS?
El compilador mecanografiado dice el siguiente error:
error TS2339: Property 'method_a' does not exist on type 'typeof T'.
En JavaScript, se puede acceder a los métodos de instancia de una clase a través del prototype de la clase:
class T { method_a() { console.log('Inside method a'); } } const method_to_be_passed = T.prototype.method_a; Tenga en cuenta que si hace referencia a this instancia de su clase dentro de su método, deberá vincular su método a alguna instancia de la clase T de esta manera:
const method_to_be_passed = T.prototype.method_a.bind(some_instance_of_T);Recuerde que una definición de class en JavaScript/TypeScript es solo azúcar sintáctica (es decir , solo abreviatura ) para definir una función de constructor y propiedades de prototype :
Así que esto
class T { val: number = 1; method_a() { console.log('Inside method a'); } } (Agregué la propiedad val como un ejemplo adicional)
Es equivalente a esto:
function T() { this.val = 1; } T.prototype.method_a = function() { console.log('Inside method a'); }; Por lo tanto, para obtener una referencia a la función method_a , debe usar el calificador de prototype :
const method_to_be_passed = T.prototype.method_a; Esto es diferente a otros lenguajes como Python, C#, C++, etc., que le permiten hacer referencia tanto a instancias como a no instancias (es decir, static ) de un tipo sin calificación adicional (por supuesto, no puede usar de manera significativa miembros de instancias sin this parámetro, por supuesto). ).
Si desea que method_a no requiera this parámetro, debe convertirlo en un miembro estático:
class T { val: number = 1; static method_a() { console.log('Inside method a'); } }que te permite hacer esto:
const method_to_be_passed = T.method_a;Ejemplo de patio de recreo: