Improved support for read-only arrays and tuples#29435
Conversation
src/compiler/diagnosticMessages.json
Outdated
| "category": "Error", | ||
| "code": 1353 | ||
| }, | ||
| "'readonly' type modifier is only permitted on array and typle types.": { |
src/compiler/checker.ts
Outdated
| } | ||
| 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)); |
| switch (operator) { | ||
| case SyntaxKind.KeyOfKeyword: | ||
| case SyntaxKind.UniqueKeyword: | ||
| case SyntaxKind.ReadonlyKeyword: |
There was a problem hiding this comment.
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. |
RyanCavanaugh
left a comment
There was a problem hiding this comment.
+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:
readonlymodifier on array types:readonly T[]corresponds toReadonlyArray<T>(similar to howT[]corresponds toArray<T>).readonlymodifier on tuple types:readonly [T0, T1, ...]correponds to a tuple type that derives fromReadonlyArray<T0 | T1 | ...>and has read-only element positions.+readonlymodifier, read-write array and tuple types are mapped to their read-only form, and when a mapped type specifies a-readonlymodifier, 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.