microsoft / microsoft/TypeScript

Assertion signature on generics doesn't narrow

Ouverte
#60,130 13 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Bug Domain: check: Control Flow Help Wanted
Langage dominant
Go
Étoiles
111k
Forks
14.4k
Merge moyen
1 j 19 h
PR mergées (30 j)
117

Description

🔎 Search Terms

Assertion AND signature

🕗 Version & Regression Information
  • This is the behavior in every version I tried, and I reviewed the FAQ for entries about Assertion Signatures, Generics.
⏯ Playground Link

https://www.typescriptlang.org/play/?noUncheckedIndexedAccess=true&allowUnusedLabels=true&downlevelIteration=true&noEmitHelpers=true&noUnusedLocals=true&noUnusedParameters=true&preserveConstEnums=true&removeComments=true&importHelpers=true&target=99&useUnknownInCatchVariables=false&exactOptionalPropertyTypes=true&noImplicitOverride=true&noFallthroughCasesInSwitch=true&noPropertyAccessFromIndexSignature=true&inlineSourceMap=true&inlineSources=true&stripInternal=true&ts=5.6.2#code/FAehAICIHEHtYCbgIYGdUFMBOAXSAucAW2QGsNVwEKcsBXAYxzqwEsA7Ac3FUYYwwJQEAGZ12TVrHYp02HAAoGhcaXawA7uwCUhNJlyUG4AN7DwFi6xHgFAQgbbT5y6-A4AFlk3h2GDeAAKgCeAA4YAKJY3lgKAOQAgnK4UjIiyKwANoJx2gDcLpYAvuYl5pAAQshI+vIEVDT0TCwc3NgxwGISOKmyBjgAPADCAHxKhEO6ffJGzq7Wtg5OZm6Wnt4BfgEh4VEx8Un9velZOfnAriVlGAAeobC44F2S0u40CpkcFISotK0A2gBdKa-NhcIHOC6rcDZHBPcTKObQ1zsZBEDA-P5cArI1yfPyoTFgzhAnHQorgAA+vjomUy4AAvDS6QUoasRA9bAxpL8YV9wLAbPiKMs2biFgoALLITwAOiwyHYCFgRAUTgG4AADLKAKyi3HQ56MpEG5Go9GESAARw02EgABoxaa3MLCeB-sLAY7nZcyQaKRhMpgTT7argFM9zj7LNz2LyTOaMPa+QSKUznnlLGBwAMGXnwBEAEqFgDyhfAAAkixEnabXbLQnRUB4Pl8o9HpuHE+A7Pm4sgAEYMXJ+3ElZHj6ESyO11ZYDDMLBpBGy12j1zzxcyNdiopAA

💻 Code

// "Good assert": makes destructuring succeed
// function assert(c: unknown): asserts c {
//     if (!c) {
//         throw new TypeError('Assertion failed');
//     }
// }

// "Bad assert": destructuring error
function assert<C>(c: C): asserts c {
    if (!c) {
        throw new TypeError('Assertion failed');
    }
}

export function test(lines: string[]): string[] {

        let func: {
            name: string;
            lines: string[];
        } | null = null;

        for (const line of lines) {
            if (Math.random() < 0.5) {
                func = {
                    name: "qwer",
                    lines: [line],
                };
            } else {
                assert(func);
                const {name, lines} = func;   // <=== ERROR HERE: 'name' implicitly has type 'any'
                lines.push(line);
                assert(name !== 'abc');
            }
        }
        if (func)
            return func.lines;
        return lines;
    }
🙁 Actual behavior

When the generic-assert implementation is active, the line -

const {name, lines} = func;

errors with 'name' implicitly has type 'any'.

When the unknown assert implementation is active, types are properly inferred.

🙂 Expected behavior

Both assert versions contain assertion signature, and both should be able to narrow the type.

Additional information about the issue

No response

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Reproduisez l’échec du narrowing dans le TypeScript Playground lié, en comparant l’assertion générique avec l’assertion ayant un paramètre unknown. Suivez le traitement des signatures d’assertion et le narrowing générique du flux de contrôle dans le compilateur, puis ajoutez un test de régression montrant que la déstructuration après assert(func) infère name et lines sans erreur d’implicit-any.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
typescript
Domaine
compilers
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
À l'abandon
Clarté
Clairement spécifiée
Accessibilité débutants
35/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.