TypeScript Version: 2.0.0 beta
Functions typed to accept union typed params incorrectly typecheck against functions whose params only match a subset of the union. Example:
interfaceCallback{(value: string|number): void;}// expect this to workconstmany: Callback=(value: string|number|boolean)=>{// ...}// expect a type error hereconstone: Callback=(value: string)=>{// ...}many(1);// should work, does workone(1);// shouldn't work, does work *many("hello");// should work, does workone("hello");// should work, does workmany(true);// shouldn't work, doesn't workone(true);// shouldn't work, doesn't workExpected
one throws a type error, since string | number is not assignable to string.
Actual
one compiles fine.
This comes up in real code when declaring a callback whose params may not be defined, e.g.
interfaceSomeLib{onChange: (callback: (newValue: string|null)=>void)=>void;}constfoo: SomeLib= ...;foo.onChange((newValue: string)=>{// oops, I forgot newValue may not be defined, but this compiles});
TypeScript Version: 2.0.0 beta
Functions typed to accept union typed params incorrectly typecheck against functions whose params only match a subset of the union. Example:
Expected
onethrows a type error, sincestring | numberis not assignable tostring.Actual
onecompiles fine.This comes up in real code when declaring a callback whose params may not be defined, e.g.