microsoft / microsoft/TypeScript

[Regression] Circular reference error when passing a class expression with non-primitive static properties to a generic function

Offen
#59,271 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Bug Domain: check: Type Circularity Help Wanted
Vorherrschende Sprache
Go
Sterne
111k
Forks
14.4k
Ø Merge
1 T. 19 Std.
Gemergte PRs (30 T.)
117

Beschreibung

🔎 Search Terms

class expression static type

🕗 Version & Regression Information
  • This changed between versions 4.0.5 and 4.1.5
⏯ Playground Link

https://www.typescriptlang.org/play/?ts=4.1.5#code/CYUwxgNghgTiAEAzArgOzAFwJYHtXzg2RlQElUAHZDAHgBUA+ACi0uoC546BKTugbgBQgsHgDOGeFHgBeAiCIlyVDE0hQxY+AEF4Ab0EBICVGxgkOHLP0BfQTe5A

💻 Code
declare function returnInput<T>(input: T): T;

const a = returnInput(class A {
	static foo = {}
//              ^?
})
🙁 Actual behavior

A.foo: any
Error: 'foo' implicitly has type 'any' because it does not have a type annotation and is referenced directly or indirectly in its own initializer.(7022)

And also note that this bug only happens when the type of foo is not a primitive type.

🙂 Expected behavior

A.foo: {}, as it works in 4.0.5

Additional information about the issue

To define a React class component, it is a common practice to include its "sub-components" as private static properties. I also use a "observer" function to make the state change auto observed. So the real-world code may look like:

import { observer } from 'mobx-react';
import { styled } from 'styled-components';

@observer
class ListView extends React.Component {
    // render method here...
    private static readonly Item = observer(class Item extends React.Component {
        private static readonly Header = styled.h4` // <- Cannot infer the type of Header
        // CSS style here...
        `;
    })
}

A workaround is to use static block to initialize the static property but it's cumbersome:

const a = returnInput(class A {
	static foo
//              ^? OK
	static { this.foo = {}; }
})

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

Beginnen Sie mit dem verknüpften TypeScript Playground und vergleichen Sie die Regression zwischen den Versionen 4.0.5 und 4.1.5 anhand des Beispiels mit der generischen Funktion und dem Klassenausdruck. Untersuchen Sie, warum die nicht-primitive statische Eigenschaft als any inferiert wird, und betrachten Sie das Issue als erledigt, wenn das Beispiel A.foo ohne Fehler 7022 als {} meldet und dabei das dokumentierte Workaround-Verhalten erhalten bleibt.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
typescript
Bereich
compilers
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Klar beschrieben
Anfängerfreundlichkeit
45/100

Neue Issues direkt in Ihr Postfach

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