microsoft / microsoft/TypeScript

Narrow typeof x === 'object' to Record<string | number | symbol, unknown> | null | unknown[]

未关闭
#38,801 9 条评论 45 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

Awaiting More Feedback Suggestion
主要语言
Go
星标
111k
派生
14.4k
平均合并
1 天 19 小时
30 天内合并 PR
117

描述

Search Terms

typeof object narrow record

Suggestion

When narrowing a variable with typeof x === 'object', narrow to Record<string | number | symbol, unknown> | null | unknown[] instead of object | null.

Use Cases

When testing to see if something is an object, you almost always are starting out with unknown or similarly near-top level type and trying to narrow down to a lower "useful" type. When you use the typeof x === 'object' narrowing operation, currently TypeScript over narrows to the extremely constrained {} | null type. This suggestion would change that behavior to narrow down to the much wider Record<string | number | symbol, unknown> | null | unknown[], which the user can then choose to narrow more if they like, or they can choose to work with it as-is.

Examples

declare const apple: unknown
if (typeof apple !== 'object') throw new Error() // actual: object | null; desired: Record<string|number|symbol, unknown> | null | unknown[]

// uncomment this line and comment out the lines above to see desired behavior
// declare const apple: Record<string|number|symbol, unknown> | null | unknown[]

if (apple === null) throw new Error() // actual: object; desired: Record<string|number|symbol, unknown> | unknown[]
if (Array.isArray(apple)) throw new Error() // actual: object; desired: Record<string|number|symbol, unknown>
for (const key in apple) {
    // Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{}'.
    //   No index signature with a parameter of type 'string' was found on type '{}'.
    apple[key] // actual: error; desired: unknown
}

Checklist

My suggestion meets these guidelines:

  • This wouldn't be a breaking change in existing TypeScript/JavaScript code
  • This wouldn't change the runtime behavior of existing JavaScript code
  • This could be implemented without emitting different JS based on the types of the expressions
  • This isn't a runtime feature (e.g. library functionality, non-ECMAScript syntax with JavaScript output, etc.)
  • This feature would agree with the rest of TypeScript's Design Goals.

贡献指南

打开贡献指南

从这里开始

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

调研方向

首先复现 issue 中的 TypeScript 示例,并将实际的 narrowing 与请求的结果进行比较。然后跟踪负责 typeof object narrowing 的类型检查路径,并为所示的 null、数组和索引访问用例添加或更新 coverage;当这些示例在不改变运行时输出的情况下 narrowing 为请求的 union 时,即表示完成。

由索引模型根据 Issue 内容生成。

评估

技术栈
typescript
领域
compilers
Issue 类型
功能
难度
5/5
预计耗时
一周以上
活跃度
停滞
描述清晰度
描述清楚
新手友好度
35/100

把新 issue 发到你的邮箱

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