microsoft / microsoft/TypeScript
New operator should return object returned by constructor
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Go
- Estrellas
- 111k
- Forks
- 14.3k
- Merge medio
- 1 d 19 h
- PR fusionados (30 d)
- 117
Descripción
Search Terms
new, operator, constructor, return, object
Suggestion
in javascript, calling with the operator new a function that returns an object does not resolves to the created instance but to the object returned by the function
Typescript should do the same.
That could offer a better compliance with the ECMAScript standard.
Use Cases
This can for example allow to create async constructor (see examples)
Examples
function foo(returnDate = false) {
this.bar = 1;
if(returnDate) return new Date()
}
const obj1 = new foo() // ES resolves to a foo instance ; typescript get error "ts(2350)"
const obj2 = new foo(true) // ES resolves to a Date ; typescript get error "ts(2350)"
obj1 instanceof foo // true
obj2 instanceof foo // false
// obj1 and obj2 type should be foo | Date
Use case example: async constructor:
class Foo {
constructor() {
return Promise.resolve().then(() => this);
}
}
const foo1 = await new Foo();
const foo2 = new Foo(); // foo2 is Promise<Foo> ; ts consider foo2 as Foo
Checklist
My suggestion meets these guidelines:
- This wouldn't be a breaking change in existing TypeScript/JavaScript code
- This wouldn't change the runtime behavior of existing JavaScript code
- This could be implemented without emitting different JS based on the types of the expressions
- This isn't a runtime feature (e.g. library functionality, non-ECMAScript syntax with JavaScript output, etc.)
- This feature would agree with the rest of TypeScript's Design Goals.
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Comienza revisando la ruta de comprobación de tipos de TypeScript para el operador new y los tipos de retorno de los constructores; el issue no especifica ningún archivo, prueba ni punto de entrada. Usa los ejemplos de JavaScript como referencia del comportamiento, incluidos los constructores que devuelven un Date o Promise, y asegúrate de que los tipos inferidos coincidan con el resultado en tiempo de ejecución sin cambiar el JavaScript emitido.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- javascript, typescript
- Área
- compilers
- Tipo de issue
- Nueva funcionalidad
- Dificultad
- 5/5
- Tiempo estimado
- Más de una semana
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 25/100