-
Notifications
You must be signed in to change notification settings - Fork 12.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Improved support for read-only arrays and tuples #29435
Conversation
src/compiler/diagnosticMessages.json
Outdated
@@ -1023,6 +1023,10 @@ | |||
"category": "Error", | |||
"code": 1353 | |||
}, | |||
"'readonly' type modifier is only permitted on array and typle types.": { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Typo: typle
to tuple
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@j-oliveras Oops. Thanks!
src/compiler/checker.ts
Outdated
@@ -30516,6 +30522,11 @@ namespace ts { | |||
return grammarErrorOnNode(node, Diagnostics.unique_symbol_types_are_not_allowed_here); | |||
} | |||
} | |||
else if (node.operator === SyntaxKind.ReadonlyKeyword) { | |||
if (node.type.kind !== SyntaxKind.ArrayType && node.type.kind !== SyntaxKind.TupleType) { | |||
return grammarErrorOnFirstToken(node, Diagnostics.readonly_type_modifier_is_only_permitted_on_array_and_typle_types, tokenToString(SyntaxKind.SymbolKeyword)); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Add test for this?
@@ -3073,6 +3074,7 @@ namespace ts { | |||
switch (operator) { | |||
case SyntaxKind.KeyOfKeyword: | |||
case SyntaxKind.UniqueKeyword: | |||
case SyntaxKind.ReadonlyKeyword: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Think we need test/handling for .d.ts generation and decorator for this new typeNode kind.
Does this improved support for readonly arrays mean it's now possible to have readonly array/tuples as the type of a rest argument?
|
@Kovensky Isn't in the PR currently, but I see no reason why we couldn't support it. I will fix it, it's just a minor change. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
+1 for .d.ts emit coverage - the only .d.ts currently in this set has semantic errors in its originating file, which makes it shaky at best
I think having decorator test is good idea too.. since we normally forget that when we enable new kind of type annotation. |
// @emitDecoratorMetadata: true
// @experimentalDecorators: true
// @declaration: true
declare const someDec: any;
class A {
@someDec
j: readonly string[];
@someDec
k: readonly [string, number];
} |
Is this an intended change that a single 'readonly' is no longer parsed as a type?
(This is not a sample from real code, just a test case.) Seems that it is not a serious issue, but would be nice to know if this was planned, as you still may declare a type named 'readonly' but cannot use it anymore. |
@zhuravlikjb No, that was not intended. I will look at getting it fixed. |
Using a version of TypeScript that contains this PR creates declaration files which are not compatible with older versions of TypeScript. In case someone else has the same problem: I created a transformer to downlevel readonly array types in declaration files: https://github.com/ajafff/ts-transform-readonly-array |
@ahejlsberg This feature leaved some large bugs (Maybe regression). Please fix them: #29442 #29702 |
@falsandtru Those issues are not related to this PR, but I have a fix in #29740. |
Indeed, I thought another PR. Anyway, thanks for fixing. |
I assume the extension to |
Is it still possible to declare a writable property with an immutable array? For example, constructable stylesheets defines element.shadowRoot.adoptedStyleSheets = [...element.shadowRoot.adoptedStyleSheets, styleSheet] |
This PR improves our support for read-only arrays and tuples:
readonly
modifier on array types:readonly T[]
corresponds toReadonlyArray<T>
(similar to howT[]
corresponds toArray<T>
).readonly
modifier on tuple types:readonly [T0, T1, ...]
correponds to a tuple type that derives fromReadonlyArray<T0 | T1 | ...>
and has read-only element positions.+readonly
modifier, read-write array and tuple types are mapped to their read-only form, and when a mapped type specifies a-readonly
modifier, read-only array types and tuples are mapped to their read-write form. This means thatReadonly<T>
now produces read-only forms of arrays and tuples.Some examples:
Fixes #26864.
Fixes #28540.
Fixes #28968.