Improved union/intersection type inference - #5738
Conversation
There was a problem hiding this comment.
How about
return forEach(target.types, t => isTypeIdenticalTo(source, t) || undefined);There was a problem hiding this comment.
Definitely an option, but not quite as efficient. I will keep what's there.
|
👍 |
There was a problem hiding this comment.
Can you break this into multiple lines?
There was a problem hiding this comment.
Use wordwrapping man.
Improved union/intersection type inference
|
Anders Hejlsberg (@ahejlsberg) You've got a little typo in your code example: function isUndefined<T>(x: Maybe<T>): x is void {
return x === undefined || x === null;
} |
|
Marius Schulz (@mariusschulz) Yes indeed, thanks for catching that. |
|
Will this address issue mentioned in #3215 ? |
|
Eugene Sadovoi (@ENikS) No, the two are unrelated. |
|
Anders Hejlsberg (@ahejlsberg) Would inferring interface A { a: any; }
function test<T>(arg: A & T): T { ... }
let result = test({a: "", b: 10});The type of |
|
Asad Saeeduddin (@masaeedu) We could potentially explore that, but it could get complex and would require type inference to manufacture new types, neither of which I'm crazy about. Specifically, in your example, we'd have to manufacture a new type |
This PR improves type inference involving source and target sides that are both union or intersection types. When inferring from a type S to a type T, if S and T are both union types or both intersection types, we first reduce S and T by removing constituents that are matched by a constituent in the other type. For example, when inferring from
string | string[]tostring | T, we reduce the types tostring[]andT, thus inferringstring[]forT.An example:
Fixes #2264.
Fixes #4212.
Fixes #5417.
Fixes #5456.