microsoft / microsoft/TypeScript
Confusing error message (2322), should use (2741) and (2322) error message when this["XXX"] = {...} has a missing (or mispelled) key or an incompatible value.
还没有人认领这个 Issue。
- 主要语言
- Go
- 星标
- 111k
- 派生
- 14.3k
- 平均合并
- 2 天 4 小时
- 30 天内合并 PR
- 132
描述
### 🔍 Search Terms
Relevant issues:
- https://github.com/microsoft/TypeScript/issues/29049
### ✅ Viability Checklist
- [x] This wouldn't be a breaking change in existing TypeScript/JavaScript code
- [x] This wouldn't change the runtime behavior of existing JavaScript code
- [x] This could be implemented without emitting different JS based on the types of the expressions
- [x] This isn't a runtime feature (e.g. library functionality, non-ECMAScript syntax with JavaScript output, new syntax sugar for JS, etc.)
- [x] This isn't a request to add a new utility type: https://github.com/microsoft/TypeScript/wiki/No-New-Utility-Types
- [x] This feature would agree with the rest of our Design Goals: https://github.com/Microsoft/TypeScript/wiki/TypeScript-Design-Goals
### ⭐ Suggestion
When we have a Record `this["faa"]` to which we affect an object with an incompatible type, e.g.:
- a key is missing (or misspelled).
- one value has the wrong type.
The following error is shown:
> Type '{}' is not assignable to type 'this["faa"]'.
> 'this["faa"]' could be instantiated with an arbitrary type which could be unrelated to '{}'.(2322)
> input.tsx(3, 19): 'key' is declared here.
In this context, I'd like the error message to be modified in order to be less confusing, i.e. :
- if a key is missing: _"Property 'key' is missing in type '{}' but required in type '{ key: number | null; }'.(2741)"_
- if one value has a wrong type: _"Type 'string' is not assignable to type 'number'.(2322)"._
### 📃 Motivating Example
[Playground Link](https://www.typescriptlang.org/play/?ts=6.0.0-dev.20260224#code/MYGwhgzhAECC0G8BQ1XQCYFNRgE6egDMB7YgLmgBcALASwgG0AiQsMJgXQG4U0sd8RNhQQBrTAE8KAOwCuAWwBGmXAB85IEAF8kvVIVmyAFAEpEetKhr0AdCWLQAvIh2XL1iHdJPE4qdCYISlwmVzcrOk97HzFJCgAWACYw1B0dJBBMSiJSET8ZBWU1DW0eaOcEHXLfOICgkKrvCvzoJJ0gA)
```ts
class A {
declare foo: this["faa"];
declare faa: {key: number|null}
fuu() {
// Type '{}' is not assignable to type 'this["faa"]'.
// 'this["faa"]' could be instantiated with an arbitrary type which could be unrelated to '{}'.(2322)
// input.tsx(3, 19): 'key' is declared here.
this.foo = {}
// Type '{ key: string; }' is not assignable to type 'this["faa"]'.
// 'this["faa"]' could be instantiated with an arbitrary type which could be unrelated to '{ key: string; }'.(2322)
this.foo = {key: "str"}
this.foo = {key: 42} // ok
}
}
let foo: {key: number|null};
// Property 'key' is missing in type '{}' but required in type '{ key: number | null; }'.(2741)
// input.tsx(12, 11): 'key' is declared here.
foo = {}
// Type 'string' is not assignable to type 'number'.(2322)
// input.tsx(12, 11): The expected type comes from property 'key' which is declared here on type '{ key: number | null; }'
foo = {key: "str"}
foo = {key: 42} // ok
```
It is easy to forget a key or to misspell it. Unfortunately, the error message is currently confusing.
When playing with `this["faa"]` we often encounter this error, and we might look at it too quickly, missing (or misunderstanding) the last line, thinking this is some kind of TS limitation.
### 💻 Use Cases
1. What do you want to use this for?
Having more explicit error messages.
2. What shortcomings exist with current approaches?
Confusing error message.
3. What workarounds are you using in the meantime?
N/A
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
先从链接的 Playground 和 issue 中作为动机的赋值开始,然后将它们的诊断与独立的 `foo` 示例进行比较,并查看相关 issue #29049。追踪 TypeScript 在哪里选择通用的 `this["faa"]` 诊断,而不是缺少属性或属性类型诊断;完成的标准是:两个不兼容的赋值报告更具体的预期消息,同时不改变有效代码或运行时输出。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- typescript
- 领域
- compilers
- Issue 类型
- 缺陷
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 活跃度
- 活跃
- 描述清晰度
- 基本清楚
- 新手友好度
- 45/100