microsoft / microsoft/TypeScript

Unexpected circularity error when variable is initialized from a class member

Offen
#61,606 4 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.3k
Ø Merge
2 T. 4 Std.
Gemergte PRs (30 T.)
132

Beschreibung

🔎 Search Terms

loss of type, for loop, for-loop, class field

🕗 Version & Regression Information
  • This changed between versions ______ and _______
  • This changed in commit or PR _______
  • This is the behavior in every version I tried, and I reviewed the FAQ for entries about _________
  • I was unable to test this on prior versions because _______
⏯ Playground Link

https://www.typescriptlang.org/play/?#code/JYOwLgpgTgZghgYwgAgIIAd0BtgLmYAexGQG8AoZK5YAEwC5kBnMKUAcwG5zLq9J2hKAE9GFahJoNmrDtwkBfckvIIscJkzSYc-IiC3jq6AK4AjXcgBioWhmy58+gBQBHE9FEy2IdgEpGe10nYmQAH2QQEywsMl5JZCgIMBMoEiiY+WolFTUNLQAVCBY4iQBlCCwIBEg7HUcCYiZGCrAAHhYfdgA+ZABeSIgAd2RW5z8sqiCG-WbtBz0m8Mjo2IGMrEnkdmTRyura6cWDACFhAGF8CEERccYABTgoAjgsNoAlaqFaDtlfABo9u1OhxumDlhtSglkAB6GHIADqQgA1k9CCYQLRkABGRgAW0IADcUGAABbALQWQgIZE0Ax0FAwITILCEQjoeKSOGIlFojFYgBMLTgxOQAAMyRSAHRHEIGMXIMCEZBwZAIJpgRWkiAkExMEmk-CciTAGDIZySpgy+rHLR9e0rGJ+KHQ6hJFJpR2bY3ZHiu9UGTVJJjRMAPJ4vN6fdVQH4ggFA35dMG9AakBTcH1UJlQc0BkpwG1ygCSABFkIQzZapRUqjUIHUFnKmM6jK6qPnNYWm40SANq7Le1abJjBy5u8Fe2WJlnJKbzROZqF7etVq3Z-7iAQohAtq6VO2+Bq1VcbsIy-0VUXe1L+NchMIpXQ99DO1ee7NL8HQwBtO9nssAF1kAAfhAwYRlaJNQXGF8EkXW0pTgWhaGcBC5SfWgZ0PKhuXOQg8TxHUwBhDF1UI4itUZQgYkIIYOBZUASWVfUUGATUzCSOBkVIkBOIgbiNzdYpf3-B8gMvdChzg5AD2hd1UhIb8sDALYciAA

💻 Code
interface Application {
    id: string;

    category: {
        id: string;
    }
}

class Applications {
    public FindApplication(query: string): Application | null {
        return null;
    }
}

class Test {
    SelectedApplications: Set<string> = new Set();
    Applications: Applications | null = null;
    get SelectedApplicationsByCategory(): Partial<Record<string, Set<string>>> | null {
        // Workaround 1: move this block inside for loop
        // Workaround 2: Save this.Applications to a const then use that
        if (this.Applications === null) {
            return null;
        }

        const result: Partial<Record<string, Set<string>>> = {};

        for (const applicationID of this.SelectedApplications) {
            const application = this.Applications.FindApplication(applicationID);
            if (application === null) {
                continue;
            }

            const categoryID = application.category.id;
            const applications = result[categoryID] ?? new Set<string>();
            applications.add(application.id);
            // Comment/uncomment the following line to see it break/unbreak
            result[categoryID] = applications;
        }

        return result;
    }
}
🙁 Actual behavior

application has type: any. FindApplication returns Application | null, but that gets lost somewhere.

🙂 Expected behavior

type for application should be Application | null.

Additional information about the issue

See comments in code for workarounds and to see another line break type inference.

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 verknüpften TypeScript Playground-Reproduktion und vergleiche die beiden dokumentierten Workarounds im Getter. Verfolge, warum die Zuweisung an result[categoryID] den abgeleiteten Typ von application ändert; abgeschlossen ist die Aufgabe, wenn application ohne einen der beiden Workarounds Application | null 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
42/100

Neue Issues direkt in Ihr Postfach

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