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
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.
Activity
ahejlsberg commentedon Nov 26, 2017
This is working as intended. The argument in the call to
fnis contextually typed byTypeAand therefore it is known that thetestproperty has a literal type. However, in theletassignment there is no contextual type, so the type of thetestproperty is widened tostringbecause the property is a mutable location.It works if you add a type annotation (thus providing a contextual type):
Duplicate of #17363 and others. For a discussion of the widening rules see #10676.
sevenryze commentedon Nov 27, 2017
Thanks for your promoting reply.
Add Typescript definition