Open
Description
Currently, the compiler will allow the following program:
export interface IAdder {
add(a: number, b: number): number;
}
export class Adder implements IAdder {
public add(a1: number, b1: number): number {
return a1 + b1;
}
}
Notice the argument names in Adder.add
are different from IAdder.add
.
This results in an incompatibility between the IAdder
interface and the Adder
class in python. See:
- (aws-rds): "DatabaseSecret" is incompatible with protocol "ISecret" aws-cdk#27852
- (@aws_cdk): Python: incompatible interface implementations due to differing function argument names jsii#4541
- (IAM): Role incorrectly implements interface IRole (Python) aws-cdk#21099
- (ec2): Subnet and ISubnet variable naming causes Pylance type error aws-cdk#20125
We should have the compiler enforce that functions in implementations (or subclasses) use the same argument names as the parent.
Notes
- Unless we roll out a new major version, we cannot start enforcing this on existing projects because the fix would have to be argument renaming, and this would be a breaking change. In order to maintain backwards compatibility and stop the proliferation of this mistake, we need to provide an allow list mechanism to ignore existing violations, as well as a feature toggle to activate this validation. In the next major version of the compiler, we can remove these provisions and start enforcing it.
- It would be nice to resurrect and merge fix(jsii-diff): renaming a positional argument is a breaking change in Python jsii#2937 as well, as this would protect us against accidental renaming, either in an attempt to fix the inconsistency, or just an ad-hoc decision to rename some arguments.