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.

Open
#63,206 13 comments 0 reactions 0 assignees View on GitHub
Bug Domain: Error Messages Help Wanted
Dominant language
Go
Stars
111k
Forks
14.3k
PR merge metrics
PR metrics pending

Description

### 🔍 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

Contributor guide

Open the contributing guide

Research direction

Start with the linked Playground and the motivating assignments in the issue, then compare their diagnostics with the standalone `foo` examples and review related issue #29049. Trace where TypeScript chooses the generic `this["faa"]` diagnostic versus property-missing or property-type diagnostics; done means the two incompatible assignments report the more specific expected messages without changing valid code or runtime output.

Written by the indexing model from the issue text.

Assessment

Tech stack
typescript
Domain
compilers
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.