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
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).
The text was updated successfully, but these errors were encountered:
aczekajski
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
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.
TypeScript Version: 2.6.0 and 2.7.0-dev.20171114
Code
See the code in TypeScript playground.
Expected behavior:
Errors in all lines invoking
foo
andbar
functions, saying that propertynothing
does not exist on typeI
orPick<I, /* something */>
.Actual behavior:
TypeScript properly raises an error when
foo
/bar
function gets an object literal that is incompatible with typeI
; It properly raises an error about property missing in object literal returned from function being passed tofoo
/bar
when we explicitely specify which type we want to be returned, but cannot raise an error aboutnothing
being incompatible withI
when it's being returned from function (even with<keyof I>
being explicitely specified forfoo
).The text was updated successfully, but these errors were encountered: