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
aws-cdk-automation pushed a commit that referenced this pull request Oct 29, 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

```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.0

(cherry picked from commit 0e9cf43)
@aws-cdk-automation
Copy link
Collaborator

💚 All backports created successfully

Status Branch Result
maintenance/v5.8

Questions ?

Please refer to the Backport tool documentation and see the Github Action logs for details

github-merge-queue bot pushed a commit that referenced this pull request Oct 29, 2025
# Backport

This will backport the following commits from `main` to
`maintenance/v5.8`:
- [feat: allow covariant overrides in classes
(#2324)](#2324)

<!--- Backport version: 9.5.1 -->

### Questions ?
Please refer to the [Backport tool
documentation](https://github.com/sorenlouv/backport)

Co-authored-by: Momo Kornher <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants