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

Aberta
#64,892 0 comentários 0 reações 1 responsável Ver no GitHub

Mantenedores costumam responder em até 1 dia

@ahejlsberg já está trabalhando nisso.

Desde 21/10/2026.

  • #64307 de @Andarist — aberto

Avaliação

Esta issue ainda não foi avaliada.

Descrição

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.

Linguagem predominante
Go
Estrelas
112k
Forks
15.4k
Merge médio
2d 21h
PRs com merge (30d)
126

Preparar o ambiente

Abrir no Codespaces

Inicia o contêiner de desenvolvimento do projeto no navegador, com a sua própria conta do GitHub.

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de microsoft/TypeScript

Todas as issues de microsoft/TypeScript

Issues semelhantes

Mais issues de Go

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.