Skip to content
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

Improve reverse mapped types #31221

Merged
merged 5 commits into from May 10, 2019
Merged

Improve reverse mapped types #31221

merged 5 commits into from May 10, 2019

Conversation

ahejlsberg
Copy link
Member

Fixes #30505.

// types because we may only have a partial result (i.e. we may have failed to make
// reverse inferences for some properties).
priority |= getObjectFlags(source) & ObjectFlags.NonInferrableType ?
InferencePriority.PartialHomomorphicMappedType : InferencePriority.HomomorphicMappedType;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I experimented with a top-level priority instead of this inner one. There are some error messages I think it makes look nicer (erroring on "1 is not assignable to string" rather than "(x: string) => string is not assignable to (x: string) => number" seems way nicer), but there's one test where we issue an error we didn't before (but that might just be because our other priorities are a little off and we're generating a type slightly too derived in the second pass). :(

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As I mentioned yesterday, I don't think that's the right approach anyway. The CheckMode.SkipContextSensitive indicates that context sensitive function expressions should be skipped if any are encountered. But what matters is whether context sensitive functions were actually skipped, and that's tracked by the ObjectFlags.NonInferrableType flag. An inference made in the first pass is just as good as an inference made in the second pass because we never infer from anything that contains non-inferrable types. Except in the case of reverse mapped types, and that's why we just need the lower priority for those.

@ahejlsberg ahejlsberg merged commit ae3d1d4 into master May 10, 2019
@ahejlsberg ahejlsberg deleted the improveReverseMappedTypes branch May 10, 2019 20:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Type of generic function parameter not being inferred from interface generic type.
2 participants