facebook / facebook/flow

Cannot refine type that's part of an intersection type

Open
#4,820 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
Rust
Stars
22.3k
Forks
1.9k
PR merge metrics
No merged PRs in 30d

Description

Reproduction: https://flow.org/try/#0C4TwDgpgBAYg9nAglAvFA3gKClA1gSwDsATALigHIBDCgGmyivMIFcBbAIwgCd6BfTJlCRYCAEKoMDAiXIUOdBh2bsuvTAKHho8OJN3IAPqLhiA3IOE6EiFgHM2EQsCrB8cQgGdJWHByrcKpw89H5UAF5BahoWmAD0cVAAKgAW+N7EcBDehHDAUADucNy4WiK2Dk7AEMS6kgAUBlDGumIAlFAAZCYVjs6u7l4WAGYshADGbh5QmYipRHb1wwjkvVU1um1RPFI4+MNQSwgAdDLEqCho1BQdvjhQ3BDALNyEUMtwx1QWOAI4DI9nq8oABGAAMFk0CWSaQyWU8mFGEymb1muWAKR480Iiw+5E2224uyg+0OH1ORHOlyuNFuDBwgJeb3J3wYfygAKeTNBEI0QA

Basically, if we have some type `T = (A | B) & C`, when we perform a check on a value of type `T` that would be able to refine `A | B` to `A`, we should be able to refine `(A | B) & C` to `A & C`.

Possibly related, changing `type AugmentedFoo = (FooA | FooB) & FooAugmentation` to `type Foo = FooA | FooB; type AugmentedFoo = Foo & FooAugmentation` causes a second error: https://flow.org/try/#0C4TwDgpgBAYg9nAglAvFA3gKClA1gSwDsATALigHIBDCgGmyivMIFcBbAIwgCd6BfTJlCRYCAEKoMDAiXIUOdBh2bsuvTAKHho8OJN3IAPqLhiA3IOE6EiFgHM2EQsCrB8cQgGdJWHByrcKpw89H5UAF5BahoWmAD0cVAAKgAW+N7EcBDehHDAUADucNy4WiK2Dk7AEMS6+ghQAGQmFY7Oru5eFgBmLIQAxm4eUJmIqUR2ABTdCOStVTW6AJRRPFI4+N1Q0wgAdDLEqCho1BRL6zhQ3BDALNyEUDNwu1QWOAI4DNe391AAjAAGCyaBLJNIZLKeTC9AZDB6jXLAFI8caEKZPcjLVbcC6bbZPfZEQ7HE40c6+S7fO4PAmvBgfKBfG7U-5AjRAA

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.