facebook / facebook/flow

Intersections have order dependent behavior

Offen
#1,735 2 Kommentare 10 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
Typing: spread Typing: unions/intersections
Vorherrschende Sprache
Rust
Sterne
22.3k
Forks
1.9k
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Beschreibung

```
// @flow
type Foo = {
foo: string,
};

type Bar = {
bar: string,
} & Foo;

type Baz = Foo & {
baz: string,
};

const bat = (foo: Foo) => foo.foo;

export const invalid = ({ bar, ...baz }: Bar) => bar && bat(baz);
export const valid = ({ baz, ...bar }: Baz) => baz && bat(bar);
```

yields

```
src/components/test.js:15
15: export const invalid = ({ bar, ...baz }: Bar) => bar && bat(baz);
^^^^^^^^ function call
14: const bat = (foo: Foo) => foo.foo;
^^^ property `foo`. Property not found in
15: export const invalid = ({ bar, ...baz }: Bar) => bar && bat(baz);
^^^ object pattern spread property

Found 1 error
```

Apologies if the names are confusing, I was trying to reduce the problem to a minimal case. But the point is, `Bar` and `Baz` are, in practice, the same type, however, the intersection operator handles them very differently. I expect this is the root cause of issues such as #1511, #1118, #824, and #1462.

Beitragsleitfaden

Beitragsleitfaden öffnen

Bewertung

Dieses Issue wurde noch nicht bewertet.

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.