[7.1 Regression] Unexpected behaviour change from Stronger Distributive Type checks

Ouverte
#64,892 0 commentaires 0 réactions 1 personne assignée Voir sur GitHub

Les mainteneurs répondent en général sous 1 jour

@ahejlsberg y travaille déjà.

Depuis le 21/10/2026.

  • #64307 par @Andarist — ouverte

Évaluation

Cette issue n'a pas encore été évaluée.

Description

Needs Investigation
🔎 Search Terms

7.1 regression, TS2345

🕗 Version & Regression Information
  • This changed between versions 7.0.2 and 7.1.0-beta
⏯ Playground Link

https://www.typescriptlang.org/play/?#code/KYDwDg9gTgLgBAYwDYEMDOa4GE4G8BQcRcAtgIwA8AKgHwAUhxTAljMCQFxxUA0jTRBCiRIARigQBrLlTig2AOwAmmNDCjMFAc34CmAfjh1W7GQEo4AXhpwAbhGZLdeol2NtO3C9bsOnTMy57RzxnYiERcSl3djMAbjDBYTEJSRiSOHRuORBFFTg1DW04Q1lzBKYAX3xdEgAmBhc4E09CzS0+JoiUqX03Fq427W8bYP9iQN9HCuJ66npE5o8ZTpduqOkjAa8rUb9dSbGZojnaRpdt3kX11JkcvNV1dsWDI3TzXamlCwAfOABXZTAABmmmA4yari2yx2PjGByCflCTWYwKMNykFgIkPCyQ26XiL1xkVS6UymFk8mAykeRS0JWy5UW1Sq+GqQA

💻 Code
export class C {
    m1<T>(
        item: T,
        callback: T extends string
            ? (item: T) => void
            : (item: T) => void
    ): void {
        callback(item);
        callback(item as T extends string ? T : T);
    }

    m2(
        item: string,
        callback?: (item: string) => void
    ): void;
    m2<T>(
        item: T,
        callback: (item: T) => void
    ): void;
    m2<T>(
        item: T,
        callback: T extends string
            ? ((item: T) => void) | undefined
            : (item: T) => void
    ): void {
        if (callback) {
            callback(item);
            callback(item as T extends string ? T : T);
        }
    }
}
🙁 Actual behavior
src/main.ts:8:18 - error TS2345: Argument of type 'T' is not assignable to parameter of type 'T'.
  'T' is only assignable to the non-distributed 'T', but 'T' has been distributed here.

8         callback(item);
                   ~~~~

src/main.ts:27:22 - error TS2345: Argument of type 'T' is not assignable to parameter of type 'T'.
  'T' is only assignable to the non-distributed 'T', but 'T' has been distributed here.

27             callback(item);
🙂 Expected behavior

No Error.

Additional information about the issue

In case of m1, if tsc is aiming to strengthen Distributive Type checks, I would hope tsc can be smart enough to "undistribute" type whenever it hits some identical declarations on different branches. As for how to define identical, I suppose it may deserve further thinkings and discussions.

For m2, we have a common way of writing overload in typescript. The condition T extends string is there for determining if a method argument is optional or not. The (strengthened) disributive check that follows is kinda unintended & unwanted effect in this case. It would be weird to let the ? T : T trick to become a part of usual type overload maintenance.

I am treating the stronger checks as regression, since it actually brings undesired behaviour changes as presented above.

Langage dominant
Go
Étoiles
112k
Forks
15.4k
Merge moyen
2 j 21 h
PR mergées (30 j)
126

Préparer son environnement

Ouvrir dans Codespaces

Lance le conteneur de développement du projet dans votre navigateur, avec votre propre compte GitHub.

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.

Autres issues de microsoft/TypeScript

Toutes les issues de microsoft/TypeScript

Issues similaires

Plus d'issues Go

Recevez les nouvelles issues par e-mail

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