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
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-returnshttps://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/overridehttps://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.0
0 commit comments