Use the width of a type to add newlines in type assignment error messages
See original GitHub issueToday we ship a one-type-fits-all style for printing type is not assignable to type messages. We’d like to improve this in a pretty simple manner: by occasionally adding newlines. For example with this arbitrary comparison:
let a = { b: { c: { e: { f: 123 } } } };
let b = { b: { c: { e: { f: "123" } } } };
a = b;
Looks like this today:
src/vendor/ata/index.ts(12,1): error TS2322: Type '{ b: { c: { e: { f: string; }; }; }; }' is not assignable to type '{ b: { c: { e: { f: number; }; }; }; }'.
The types of 'b.c.e.f' are incompatible between these types.
Type 'string' is not assignable to type 'number'.
I propose that because both of the printed types are longer than 20-30 chars, then we switch to:
src/vendor/ata/index.ts(12,1): error TS2322: Type:
{ b: { c: { e: { f: string; }; }; }; }
is not assignable to type:
{ b: { c: { e: { f: number; }; }; }; }
The types of 'b.c.e.f' are incompatible between these types.
Type 'string' is not assignable to type 'number'.
Key details
- Strip the quotes around the type
- Add colons and newlines if the type is over a certain size. Let’s call it 30 characters for now, and make it easy to change and we can experiment at the final stages of review.
Some Examples
No changes
let a = 123
let b = "abc"
a = b
- Before:
src/index.ts(21,1): error TS2322: Type 'string' is not assignable to type 'number'.
- After:
src/index.ts(21,1): error TS2322: Type 'string' is not assignable to type 'number'.
No change! (Though a part of me does really want to drop the quotes for primitives)
window = {}
Type '{}' is not assignable to type 'Window & typeof globalThis'.
Type '{}' is missing the following properties from type 'Window': clientInformation, closed, customElements, devicePixelRatio, and 189 more. (2322)
No change! {}
and Window & typeof globalThis
are too small.
Changing one
window = addEventListener
src/index.ts(1,1): error TS2322: Type '{ <K extends keyof WindowEventMap>(type: K, listener: (this: Window, ev: WindowEventMap[K]) => any, options?: boolean | AddEventListenerOptions | undefined): void; (type: string, listener: EventListenerOrEventListenerObject, options?: boolean | ... 1 more ... | undefined): void; }' is not assignable to type 'Window & typeof globalThis'.
Type '{ <K extends keyof WindowEventMap>(type: K, listener: (this: Window, ev: WindowEventMap[K]) => any, options?: boolean | AddEventListenerOptions | undefined): void; (type: string, listener: EventListenerOrEventListenerObject, options?: boolean | ... 1 more ... | undefined): void; }' is missing the following properties from type 'Window': HTMLDocument, closed, customElements, devicePixelRatio, and 187 more.
src/vendor/ata/index.ts(12,1): error TS2322: Type:
{ <K extends keyof WindowEventMap>(type: K, listener: (this: Window, ev: WindowEventMap[K]) => any, options?: boolean | AddEventListenerOptions | undefined): void; (type: string, listener: EventListenerOrEventListenerObject, options?: boolean | ... 1 more ... | undefined): void; }
is not assignable to type:
Window & typeof globalThis
Type '{ <K extends keyof WindowEventMap>(type: K, listener: (this: Window, ev: WindowEventMap[K]) => any, options?: boolean | AddEventListenerOptions | undefined): void; (type: string, listener: EventListenerOrEventListenerObject, options?: boolean | ... 1 more ... | undefined): void; }' is missing the following properties from type 'Window': HTMLDocument, closed, customElements, devicePixelRatio, and 187 more.
Changing both
Animation = AnalyserNode
index.ts(12,1) Type '{ new (context: BaseAudioContext, options?: AnalyserOptions | undefined): AnalyserNode; prototype: AnalyserNode; }' is not assignable to type '{ new (effect?: AnimationEffect | null | undefined, timeline?: AnimationTimeline | null | undefined): Animation; prototype: Animation; }'.
Types of property 'prototype' are incompatible.
Type 'AnalyserNode' is missing the following properties from type 'Animation': currentTime, effect, finished, id, and 18 more.
index.ts(12,1) Type:
{ new (context: BaseAudioContext, options?: AnalyserOptions | undefined): AnalyserNode; prototype: AnalyserNode; }
is not assignable to type:
{ new (effect?: AnimationEffect | null | undefined, timeline?: AnimationTimeline | null | undefined): Animation; prototype: Animation; }
Types of property 'prototype' are incompatible.
Type 'AnalyserNode' is missing the following properties from type 'Animation': currentTime, effect, finished, id, and 18 more.
Issue Analytics
- State:
- Created 2 years ago
- Reactions:22
- Comments:9 (4 by maintainers)
Top Results From Across the Web
How to add line breaks to an HTML textarea - Stack Overflow
The problem comes from the fact that line breaks ( \n\r ?) are not the same as HTML <br/> tags: var text =...
Read more >Line breaks in email notifications and rich HTML
Rich HTML provides additional control over line breaks in your email notifications and templates.
Read more >How to retain line breaks when sending placeholders in HTML ...
Solution Two - Using a calculation to add <BR /> tags (when using a HTML field for the notification body). If you are...
Read more >VBA New Line / Carriage Return - Automate Excel
The following code shows you how you would use vbNewLine in order to put the second text string on a new line in...
Read more >textwrap — Text wrapping and filling — Python 3.11.1 ...
Source code: Lib/textwrap.py The textwrap module provides some convenience functions, as well as TextWrapper, the class that does all the work.
Read more >Top Related Medium Post
No results found
Top Related StackOverflow Question
No results found
Troubleshoot Live Code
Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start FreeTop Related Reddit Thread
No results found
Top Related Hackernoon Post
No results found
Top Related Tweet
No results found
Top Related Dev.to Post
No results found
Top Related Hashnode Post
No results found
Top GitHub Comments
Then it becomes a garden path sentence:
“What’s a type string? Does that mean literal string types? Oh wait, it means the actual type ‘string’.”
It’s better with the quotes.
@prabhatmishra33 I think @cytler is already working on it,