Commit 0e9cf43
authored
feat: allow covariant overrides in classes (#2324)
Relaxes the the restriction on covariant overrides as currently
documented here:
https://aws.github.io/jsii/user-guides/lib-author/typescript-restrictions/#covariant-overrides-parameter-list-changes
Use of this new feature is indicated by the `class-covariant-overrides`
feature in the produced jsii assembly.
## What is the change?
It is now allowed to override the _type of readonly class properties_
and the _return type of class methods_ in class inheritance, as long as
the changes are covariant to the superclass. Importantly, we still don't
allow covariant overrides when implementing interfaces.
✅ now possible
```ts
export class Superclass {}
export class Subclass extends Superclass {}
export class SomethingUnspecific {
public readonly something = new Superclass();
public returnSomething(): Superclass {
return new Superclass();
}
}
// Subclass is covariant to Superclass
export class SomethingSpecific extends SomethingUnspecific {
public readonly something = new Subclass();
public returnSomething(): Subclass {
return new Subclass();
}
}
```
❌ still prohibited
```ts
export class Superclass {}
export class Subclass extends Superclass {}
export interface ISomething {
something: Superclass;
returnSomething(): Superclass;
}
// ❌ covariant changes are still prohibited when implementing an interface
export class SomethingImpl implements ISomething {
public something: Subclass = new Subclass();
public returnSomething(): Subclass {
return new Subclass();
}
}
```
## Why is this safe now?
We can make these changes now, because C# 9 has added the necessary
support, and this version of C# has been introduced in .NET 5.
In jsii we have now made the necessary change to [increase the target
framework to `net6.0`](aws/jsii#4916).
C# references:
https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-9.0/covariant-returns
https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/override
https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/knowing-when-to-use-override-and-new-keywords
---
By submitting this pull request, I confirm that my contribution is made
under the terms of the [Apache 2.0 license].
[Apache 2.0 license]: https://www.apache.org/licenses/LICENSE-2.01 parent 2b878e9 commit 0e9cf43
File tree
22 files changed
+813
-91
lines changed- src
- test
- __snapshots__
- negatives
22 files changed
+813
-91
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
226 | 226 | | |
227 | 227 | | |
228 | 228 | | |
229 | | - | |
| 229 | + | |
230 | 230 | | |
231 | 231 | | |
232 | 232 | | |
| |||
249 | 249 | | |
250 | 250 | | |
251 | 251 | | |
| 252 | + | |
| 253 | + | |
| 254 | + | |
| 255 | + | |
| 256 | + | |
| 257 | + | |
| 258 | + | |
| 259 | + | |
| 260 | + | |
252 | 261 | | |
253 | 262 | | |
254 | 263 | | |
| |||
269 | 278 | | |
270 | 279 | | |
271 | 280 | | |
| 281 | + | |
| 282 | + | |
| 283 | + | |
| 284 | + | |
272 | 285 | | |
273 | 286 | | |
274 | 287 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
28 | 28 | | |
29 | 29 | | |
30 | 30 | | |
31 | | - | |
| 31 | + | |
32 | 32 | | |
33 | 33 | | |
34 | 34 | | |
| |||
0 commit comments