Skip to content

Conversation

mrgrain
Copy link
Contributor

@mrgrain mrgrain commented Sep 11, 2025

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

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

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.

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.

@mrgrain mrgrain changed the title feat: allow covariant-overrides feat: allow some covariant overrides Sep 11, 2025
@mrgrain mrgrain force-pushed the mrgrain/feat/covariant-overrides branch 4 times, most recently from df6761e to 83e56ae Compare September 12, 2025 09:57
@mrgrain mrgrain changed the title feat: allow some covariant overrides feat: allow covariant overrides in classes Sep 12, 2025
@mrgrain mrgrain force-pushed the mrgrain/feat/covariant-overrides branch 3 times, most recently from bd3a0e0 to a419c49 Compare September 12, 2025 11:30
@mrgrain mrgrain force-pushed the mrgrain/feat/covariant-overrides branch 5 times, most recently from 8b2f823 to b43ea60 Compare October 17, 2025 20:30
@mrgrain mrgrain force-pushed the mrgrain/feat/covariant-overrides branch from b43ea60 to b59588f Compare October 17, 2025 22:01
@mrgrain mrgrain marked this pull request as ready for review October 17, 2025 22:02
@aws-cdk-automation aws-cdk-automation added this pull request to the merge queue Oct 20, 2025
Merged via the queue into main with commit 0e9cf43 Oct 20, 2025
80 checks passed
@aws-cdk-automation aws-cdk-automation deleted the mrgrain/feat/covariant-overrides branch October 20, 2025 11:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants