javascript - Llamar a un método desde el constructor: Error: TypeError no detectado: undefined no es una función
Tarea: Necesito construir una clase en Typescript que llame a algunos de sus propios métodos en su propio constructor.
Problema: El código real que el siguiente código de ejemplo representa se compilará con éxito, pero al probarlo en la consola de Javascript, no lo hace.
Ejemplo:
export class volumeEQ
{
constructor(ctx:any)
{
this.ctx = ctx; // Audio context saved into member variable of class
this.setupAudioNodes(); // Sets up nodes made out of audio
}
setupAudioNodes()
{
this.sourceNode.connect(this.ctx.destination); // Connect to destination
}
}
Técnico: El compilador de Typescript no tiene ningún problema con this.setupAudioNodes(), pero una vez llamado como Javascript dentro de la consola de Javascript del navegador, recibo un error Uncaught TypeError: undefined is not a function. Efectivamente, esto es un problema con la sintaxis this. de Javascript y lo fácil que es confundirse con ella. Pero como estoy desarrollando en Typescript, quiero una solución más al estilo de Typescript.
Pregunta: ¿Cómo puedo llamar a los métodos de una clase desde su constructor en Typescript?
Respuesta #1
Aquí se muestra cómo llamar a un método desde el constructor:
class Thing {
constructor(name: string) {
this.greet(name);
}
greet(whatToGreet: string) {
console.log('Hello, ' + whatToGreet + '!')
}
}
var x = new Thing('world'); // Prints "Hello, world!"
Respuesta #2
Lo siguiente es lo que estaba buscando.
Fuente de la solución:
¿Cómo puedo preservar el ámbito léxico en TypeScript con una función de retorno de llamada?
Cómo preservar el ámbito léxico de this. en TypeScript:
si la siguiente declaración de métodos no está funcionando:
export class myClass
{
constructor()
{
var myString:string = this.myMethod(true);
}
public myMethod(useBigString:boolean) : string
{
if(useBigString)
{
return "bigString";
}
return "smlStr";
}
}
que produce un método en JavaScript como el siguiente:
myClass.prototype.myMethod = function (useBigString) {
En su lugar, intenta declarar tus métodos de esta manera:
export class myClass
{
constructor()
{
var initString:string = this.myMethod(true);
}
public myMethod = (useBigString:boolean) : string => {
if(useBigString)
{
return "bigString";
}
return "smlStr";
}
}
que declara el método en JavaScript desde dentro del constructor:
this.myMethod = function(useBigString) {
Un inconveniente es que el resaltado de sintaxis de métodos no reconocerá este tipo de definición, ¡pero definitivamente se compila y funciona! Esta situación no se aplica a las variables de clase como lo hace con los métodos de clase.
