-
Notifications
You must be signed in to change notification settings - Fork 12.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Excess properties are not checked e.g. in callbacks #7547
Comments
@JsonFreeman @ahejlsberg Function return type widening strikes again. Any ideas on a way to catch this? |
Hi, E.g. if I have interface A {
a: string;
b: number
}
let f: () => A = () => { // Error here
// do some stuff
1 + 1 == 42;
// return a value
return {
a: "test"
};
}; then I get the error let f: () => A = (): A => {
// do some stuff
1 + 1 == 42;
// return a value
return { // Error here
a: "test"
};
}; to get the error at the E.g. in the example from @Ciantic, if you write let a: Test = myMutator((): Test => ({
notAProperty : "woot?"
})); then you would also get the extra-properties error. Thanks! |
This does happen. interface StringCallback {
(s: string): void;
}
var x: () => StringCallback = () => {
return s => s.length; // s: string
} The problem is that extra property checking doesn't occur as a result of contextual typing, it happens during regular assignability when the object type is "fresh". When we widen the return type of the return expressions to produce the return type of the function, the freshness is lost and there's no checking of extra properties. |
#241 is the widening issue for the record. |
Oh boy. This does look like a familiar problem. I agree that it's worth addressing #241 broadly. |
Ideally this would be an error. Unfortunately it turns out to be very difficult to fix this without possibly having consequences in terms of runaway recursion and/or performance (see also discussion notes at #8228). We're still tracking the root cause (widening the types of function expressions return types) at #241. If more symptoms of this behavior become apparent we'll look at addressing this again, but as it stands it's too complex to fix this relative to the improvement in behavior (which can be worked around with a type annotation). |
This just bit me too. interface HasX { x: number; }
const toX: () => HasX = () => ({ x: 0, y: 0 }); (Would also have been solved by #12936) |
My original issue seems to error out these days, I tried opening my old code in playground. @andy-ms's example does not cause error. So part of this was fixed? |
@Ciantic the error is that there is no compile error when there should be. |
@andy-ms yes, I know, but my original comment contains a code that behaved similarly: It used to not show an error, but now that I tried the compiler gives an error. So partially this is fixed, my original issue seems to be not there anymore. However you have discovered a different case from my original. |
The fix for that might have been #16047. |
Hi, I noticed that this issue was closed over a year ago due to complexity in creating a fix. I wondered if this is still the case? In the codebase I'm working on, we're using generics to specify expected types returned from callbacks. At the moment, excess properties are allowed through (usually spelling mistakes), which causes us hassle from time to time. (Please ask for code examples if required) |
Hi, any help on this issue would be appreciated. Am I correct that this issue causes the generic in TypeScript's type definitions for map<U>(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): U[]; Looking at this, I would think that it would enforce that the return value is an array of type type V = {
foo: string
}
arr.map<V>( el => {
return {
foo: string
bar: 24 // No Error!
}
}
arr.map( (el): V => {
return {
foo: string
bar: 24 // Error!
}
} |
This might be a feature, but it sure is odd. The excess property check is not working on callbacks, e.g.:
Is there a trick to enforce the excess property check in situations like the one above?
Here is a link to playground.
The text was updated successfully, but these errors were encountered: