¿Se puede usar `this` al especificar un valor predeterminado en TypeScript?
¿Está this en el alcance en la lista de parámetros de un método en TypeScript?
Considera el siguiente código:
class Foo {
constructor(public name) {}
bar(str: string = this.name) { console.log(str); }
}
let f = new Foo("Yo");
f.bar();
El valor predeterminado de str se especifica usando this aunque no estemos dentro del cuerpo de un método de instancia.
Actualmente (en TypeScript 1.8) esto funciona ya que se transpila a:
Foo.prototype.bar = function (str) {
if (str === void 0) { str = this.name; }
console.log(str);
};
Entonces this se usa dentro del método, pero ¿se especifica que esto es legal?
No pude encontrar una respuesta a esto con una mirada superficial a la especificación.
Nota: Esto no es legal en C++, lo que me hace cuestionar si es una característica intencionada o simplemente un artefacto del proceso de transpilación.
Respuesta #1
En la sección 8.3.1 Parámetros del Constructor se indica explícitamente que usar this en las expresiones de valor predeterminado de los parámetros del constructor es un error.
En la sección 8.4.2 Declaraciones de Funciones Miembro no se menciona ningún error por usar this en expresiones de valor por defecto en métodos ordinarios de clase (no constructores).
La Sección 6.6 Generación de Código finalmente explica que el código se genera en la forma de:
if (<Parameter> === void 0) { <Parameter> = <Default>; }
Donde Parameter es el nombre del parámetro y Default es la expresión del valor predeterminado.
En otras palabras, la especificación actual permite explícitamente usar this en las expresiones de valor predeterminado de los parámetros, excepto en el constructor.
Tu código es perfectamente válido según la especificación.
Respuesta #2
Sí. Es válido según la especificación de EcmaScript 6 y el transpilador de TypeScript debería tratarlo como tal.
Como los argumentos por defecto se evalúan en el momento de la llamada, incluso puedes usar llamadas a métodos y otros argumentos en el valor por defecto.
