microsoft / microsoft/TypeScript

New operator should return object returned by constructor

Offen
#38,519 10 Kommentare 11 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Awaiting More Feedback Suggestion
Vorherrschende Sprache
Go
Sterne
111k
Forks
14.3k
Ø Merge
2 T. 4 Std.
Gemergte PRs (30 T.)
132

Beschreibung

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.

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne mit der Überprüfung des TypeScript-Typprüfpfads für den new-Operator und die Rückgabetypen von Konstruktoren; das Issue nennt keine Datei, keinen Test und keinen Einstiegspunkt. Verwende die JavaScript-Beispiele als Verhaltensreferenz, einschließlich Konstruktoren, die ein Date oder Promise zurückgeben, und stelle sicher, dass die inferierten Typen mit dem Laufzeitergebnis übereinstimmen, ohne das erzeugte JavaScript zu ändern.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
javascript, typescript
Bereich
compilers
Issue-Typ
Feature
Schwierigkeit
5/5
Geschätzter Aufwand
Über eine Woche
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
25/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.