Microsoft/TypeScript

Different `typeof` behavior between ES targets

開放

#49,394 建立於 2022年6月5日

 (4 則留言) (0 個反應) (0 位負責人)TypeScript (13,395 個分叉)batch import
BugDomain: BinderHelp Wanted

倉庫指標

星標
 (108,860 顆星)
PR 合併指標
 (PR 指標待抓取)

描述

Bug Report

🔎 Search Terms

Sorry, hard to formulate.

🕗 Version & Regression Information

  • This bug happens at least since version 3.3.3 (current lowest in playground)
  • This bug happens only when target is greater than es5

⏯ Playground Link

Playground link with relevant code

💻 Code

declare function create<T>(fn: (get: () => T) => T): T

// Error: Cannot find name '_self'.
const store = create((get: () => typeof _self) => {
    const _self = {
        id: 123
    }

    return _self
})

🙁 Actual behavior

If tsconfig property target is greater than es5 TS gives an error: Cannot find name '_self', yet type of store is inferred correctly. For es3 and es5 it works fine.

🙂 Expected behavior

No error 😄


I think it could be related to hoisting rules. Because es5 doesn't have let and const keywords and var is considered to be visible anywhere inside function. But maybe I'm wrong.

Anyway, it would be nice if it worked, as it allows to help the compiler to infer circularly dependent types. Here is the actual example: https://github.com/pmndrs/zustand/discussions/991.

貢獻者指南