- Notifications
You must be signed in to change notification settings - Fork 13.2k
Closed
Labels
Working as IntendedThe behavior described is the intended behavior; this is not a bugThe behavior described is the intended behavior; this is not a bug
Description
TypeScript Version: 2.7.0-dev.20171216
Code
classBase{}classDerivedextendsBase{publicderived=true;}interfaceISetter0<T>{set(x: T): void;}interfaceISetter1<T>{set: (x: T)=>void;}constderivedSetter0: ISetter0<Derived>={set: ()=>null};// assignment 0constderivedSetter1: ISetter1<Derived>={set: ()=>null};// assignment 1letbaseSetter0: ISetter0<Base>=derivedSetter0;// assignment 2letbaseSetter1: ISetter1<Base>=derivedSetter1;// assignment 3baseSetter0=derivedSetter1;// assignment 4baseSetter1=derivedSetter0;// assignment 5Compiler options:
"compilerOptions":{"strict": true, "strictFunctionTypes": true, }, Expected behavior:
Compilation should fail at assignments 2, 3, 4 and 5.
Actual behavior:
Compilation only fails at assigments 3 and 5.
tsc output:
test.ts(17,5): error TS2322: Type 'ISetter1<Derived>' is not assignable to type 'ISetter1<Base>'. Type 'Base' is not assignable to type 'Derived'. Property 'derived' is missing in type 'Base'. test.ts(20,1): error TS2322: Type 'ISetter0<Derived>' is not assignable to type 'ISetter1<Base>'. Types of property 'set' are incompatible. Type '(x: Derived) => void' is not assignable to type '(x: Base) => void'. Types of parameters 'x' and 'x' are incompatible. Type 'Base' is not assignable to type 'Derived'. Additional Notes:
The expected behavior handles contravariance correctly, the actual behavior not.
This bug could be part of the more general issue “Covariance / Contravariance Annotations”, but a full covariance / contravariance implementation is probably not necessary to fix this bug. It would probably also be fixed if
“Proposal: covariance and contravariance generic type arguments annotations” is implemented.
Metadata
Metadata
Assignees
Labels
Working as IntendedThe behavior described is the intended behavior; this is not a bugThe behavior described is the intended behavior; this is not a bug