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
{{ message }}
Repository navigation
Type inference cannot properly infer type for object literal returned from function #20008
declarenamespaceModule{classMyClass<T>{// template functions using Pick foo<KextendskeyofT>(o: Pick<T,K>): void;foo<KextendskeyofT>(f: ()=>Pick<T,K>): void;// simple example without generics and Pick bar(o: T): void;bar(f: ()=>T): void;}}interfaceI{value: number;}classCextendsModule.MyClass<I>{privatefn(){this.foo({nothing: 5});// ERROR | here it knows that "nothing" does not exist on Ithis.foo(()=>({nothing: 5}));// NO ERROR | but now it cannot infer that "nothing" does not exist on Ithis.foo<keyofI>(()=>({nothing: 5}));// ERROR | we explicitely provided a "keyof I" so K from line 6 is no longer inferred, and now it is able to say that the "value" property is missing, good this.foo<keyofI>(()=>({nothing: 5,value: 6}));// NO ERROR | then we add missing "value" property to returned object and it still cannot see the additional "nothing", even though it was able to infer some information about the object// the same goes for the "bar" function, so it is not a problem of generics this.bar({nothing: 5});// ERROR | as desiredthis.bar(()=>({nothing: 5}));// ERROR | can see missing "value"this.bar(()=>({nothing: 5,value: 6}));// NO ERROR | cannot see unwanted "nothing"}}
Expected behavior:
Errors in all lines invoking foo and bar functions, saying that property nothing does not exist on type I or Pick<I, /* something */>.
Actual behavior:
TypeScript properly raises an error when foo/bar function gets an object literal that is incompatible with type I; It properly raises an error about property missing in object literal returned from function being passed to foo/bar when we explicitely specify which type we want to be returned, but cannot raise an error about nothing being incompatible with I when it's being returned from function (even with <keyof I> being explicitely specified for foo).
changed the title [-]Type inference for returned parameters cannot properly infer type returned from function[/-][+]Type inference cannot properly infer type for object literal returned from function[/+]on Nov 14, 2017
Automatically closing this issue for housekeeping purposes. The issue labels indicate that it is unactionable at the moment or has already been addressed.
Activity
[-]Type inference for returned parameters cannot properly infer type returned from function[/-][+]Type inference cannot properly infer type for object literal returned from function[/+]RyanCavanaugh commentedon Nov 14, 2017
Duplicate #241 - the widening of the types of the function expressions' return values is what's causing this
RyanCavanaugh commentedon Nov 14, 2017
See also #7547
typescript-bot commentedon Nov 29, 2017
Automatically closing this issue for housekeeping purposes. The issue labels indicate that it is unactionable at the moment or has already been addressed.