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

未关闭
#64,892 0 条评论 0 个 reaction 已指派 1 人 在 GitHub 查看

维护者通常 1 天内回复

@ahejlsberg 已经在做这个了。

开始于 2026年10月21日。

  • #64307 来自 @Andarist —— 未关闭

评估

这个 Issue 还没有评估数据。

描述

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.

主要语言
Go
星标
112k
派生
15.4k
平均合并
3 天 1 小时
30 天内合并 PR
136

环境准备

在 Codespaces 中打开

在浏览器里用你自己的 GitHub 账号启动这个项目的开发容器。

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

microsoft/TypeScript 的其他 Issue

查看 microsoft/TypeScript 的全部 Issue

相似的 Issue

更多 Go Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。