[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
平均合併
2 天 21 小時
30 天內合併 PR
126

環境準備

在 Codespaces 中開啟

在瀏覽器裡用你自己的 GitHub 帳號啟動這個專案的開發容器。

從這裡開始

  1. 先讀完整個 Issue,再讀專案的貢獻指南。
  2. 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
  3. Fork 儲存庫,在一個分支上完成修改。
  4. 送出 Pull Request,並在描述裡引用這個 Issue 編號。

microsoft/TypeScript 的其他 Issue

查看 microsoft/TypeScript 的全部 Issue

相似的 Issue

更多 Go Issue

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。