Búsqueda de sitios web

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.

Artículos relacionados