You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Add related error spans for getter/setters with different types #25002
if you could point me in the correct direction (where do I find the error messages) I will take a look at it.
Thank you and regards
bashdx
EDIT:
If I got it right it revolves around src/compiler/diagnosticMessages.json - there you have a bunch of JS objects like
"'get' and 'set' accessor must have the same type.": { "category": "Error", "code": 2380 },
The build will generate the appropriate JS in for example tsc.js?
How do you inject the type information in there if you had format parameter in the string?
The issue in the OP is about adding additional information to the error message. We have recently allowed an error message to include child messages (to add clarifications), we call these related spans. See #25359 for a similar change.
Thank you for your reply. I built the compiler and tried the following with your code snippet from above:
`$ node tsc.js --target "ES5" test_accessors.ts
test_accessors.ts:4:3 - error TS2322: Type '100' is not assignable to type 'string'.
I can't get error 2380 to be invoked. Could you please provide a fitting code snippet. Using a class instead of an object resulted in a similar result.
That did it! I am getting closer - could you please tell me, how to create a "blank" node? The current result looks like this (please ignore the unrelated error message about generators - this was solely for testing). Where would I create the message for the related span?
built/local/test_accessors.ts:2:9 - error TS2380: 'get' and 'set' accessor must have the same type, but this 'get' accessor has the type 'number'.
2 get foo(): number { return 100; },
~~~
built/local/test_accessors.ts:3:9
3 set foo(value: string) { }
~~~
Generators are not allowed in an ambient context.
built/local/test_accessors.ts:3:9 - error TS2380: 'get' and 'set' accessor must have the same type, but this 'get' accessor has the type 'string'.
3 set foo(value: string) { }
~~~
built/local/test_accessors.ts:2:9
2 get foo(): number { return 100; },
~~~
Generators are not allowed in an ambient context.
The rest of the output can stay like this? This very format? Also it seems the error handler is invoked twice, while the former aims for the getter (inteded) and the latter aims for the setter, but uses the getter error message. I will check it out ASAP.
There is no restriction on getset in ECMA specification, so adhering to the standard, shouldn't this restriction be lifted? I mean "'get' and 'set' accessor must have the same type".
Reacted by Mateusz Turcza, Martin Heidegger, Szymon Marczak, Aleksey Kliger (λgeek) and MatheusLeitao
To me its a reasonable limitation that getter/setter should not have different type but this should imo. be handled by a linter rather than the compiler.
What I have been thinking is that this might be related to the writeonly proposal #21759. Maybe having a type declaration such as the following could help to get a mental model for how getters/setters have different types:
Another real-life example I have for this is the sketch api which does C mappings and has properties that can be set with partial objects but the getters will return filled-out instances.
Activity
bashdx commentedon Jun 30, 2018
Hello guys,
if you could point me in the correct direction (where do I find the error messages) I will take a look at it.
Thank you and regards
bashdx
EDIT:
If I got it right it revolves around src/compiler/diagnosticMessages.json - there you have a bunch of JS objects like
"'get' and 'set' accessor must have the same type.": { "category": "Error", "code": 2380 },The build will generate the appropriate JS in for example tsc.js?
How do you inject the type information in there if you had format parameter in the string?
mhegazy commentedon Jul 2, 2018
The issue in the OP is about adding additional information to the error message. We have recently allowed an error message to include child messages (to add clarifications), we call these related spans. See #25359 for a similar change.
bashdx commentedon Jul 2, 2018
Thank you for your reply. I built the compiler and tried the following with your code snippet from above:
`$ node tsc.js --target "ES5" test_accessors.ts
test_accessors.ts:4:3 - error TS2322: Type '100' is not assignable to type 'string'.
4 return 100;
~~~~~~~~~~~
test_accessors.ts:6:26 - error TS1005: '{' expected.
6 set foo(value: string):{}
~
`
I can't get error
2380to be invoked. Could you please provide a fitting code snippet. Using a class instead of an object resulted in a similar result.Thank you and regards
mhegazy commentedon Jul 2, 2018
Try this instead:
bashdx commentedon Jul 2, 2018
That did it! I am getting closer - could you please tell me, how to create a "blank" node? The current result looks like this (please ignore the unrelated error message about generators - this was solely for testing). Where would I create the message for the related span?
mhegazy commentedon Jul 2, 2018
not sure why you are getting the error
Generators are not allowed in an ambient context...bashdx commentedon Jul 2, 2018
This was just a random error message I picked to test the behavior of my changes.
mhegazy commentedon Jul 2, 2018
Ahh.. take a look at #25377 then.
mhegazy commentedon Jul 2, 2018
To add a new error message, you need to edit https://github.com/Microsoft/TypeScript/blob/master/src/compiler/diagnosticMessages.json
see 4459730#diff-e119cc28df9582f9e1ca0d41720ea142
bashdx commentedon Jul 2, 2018
The rest of the output can stay like this? This very format? Also it seems the error handler is invoked twice, while the former aims for the getter (inteded) and the latter aims for the setter, but uses the getter error message. I will check it out ASAP.
5 remaining items
microsoft#25002: removed unneccessary newlines
RyanCavanaugh commentedon Jan 8, 2020
Open to ideas here that have some concrete improvement
acagastya commentedon Feb 6, 2020
There is no restriction on
getsetin ECMA specification, so adhering to the standard, shouldn't this restriction be lifted? I mean "'get' and 'set' accessor must have the same type".sirian commentedon Mar 21, 2020
setters and getters MAY HAVE different types
Another example:
Ryan Cavanaugh (@RyanCavanaugh)
martinheidegger commentedon Sep 3, 2020
To me its a reasonable limitation that getter/setter should not have different type but this should imo. be handled by a linter rather than the compiler.
What I have been thinking is that this might be related to the writeonly proposal #21759. Maybe having a type declaration such as the following could help to get a mental model for how getters/setters have different types:
Another real-life example I have for this is the sketch api which does C mappings and has properties that can be set with partial objects but the getters will return filled-out instances.
acagastya commentedon Sep 3, 2020
Martin Heidegger (@martinheidegger) that limitation is not per ECMA standards and only serves as additional gatekeeping.
szmarczak commentedon Nov 14, 2020
I completely agree with Agastya Chandrakant (@acagastya) and sirian. Different setters/getters are very useful when doing normalization.
/cc Sindre Sorhus (@sindresorhus)