You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// A *self-contained* demonstration of the problem follows...// Test this by running `tsc` on the command-line, rather than through another build tool such as Gulp, Webpack, etc.interfaceTypeA{test: "test1"|"test2"|"test3"}functionfn(param: TypeA){}// Check passfn({test: "test1"});// The same object, but passed by object referenceletobj={test: "test1"};/** * Error:(26, 4) TS2345: Argument of type '{ test: string; }' is not assignable to parameter of type 'TypeA'. * Types of property 'test' are incompatible. * Type 'string' is not assignable to type '"test1" | "test2" | "test3"'. */fn(obj);
Expected behavior:
Check pass Actual behavior:
I get a TS2345
The text was updated successfully, but these errors were encountered:
This is working as intended. The argument in the call to fn is contextually typed by TypeA and therefore it is known that the test property has a literal type. However, in the let assignment there is no contextual type, so the type of the test property is widened to string because the property is a mutable location.
It works if you add a type annotation (thus providing a contextual type):
letobj: TypeA={test: "test1"};
Duplicate of #17363 and others. For a discussion of the widening rules see #10676.
TypeScript Version: 2.7.0-dev.201xxxxx
Code
Expected behavior:
Check pass
Actual behavior:
I get a TS2345
The text was updated successfully, but these errors were encountered: