facebook / facebook/flow

Refinement of polymorphic type does not work

Offen
#3,679 1 Kommentar 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
Vorherrschende Sprache
Rust
Sterne
22.3k
Forks
1.9k
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Beschreibung

Refining a type which has a polymorphic subtype doesn't seem to work properly.

Here's the code:

```js
export type InnerTypeA = {
type: "A",
};

export type InnerTypeB = {
type: "B",
};

export type InnerType = InnerTypeA | InnerTypeB;

type OuterType = {
inner: T,
};

export type OuterTypeA = OuterType;
export type OuterTypeB = OuterType;

function test(a: OuterTypeB) {}
function test2(a: OuterType) {}

function b(a: OuterType) {
if (a.inner.type === "B") {
// Doesn't work:
test(a);

// Works, which means the inner refinement is still there
// test({inner: a.inner});

// Works, which means the outer refinement is also there?
// test2(a);
}
}

b({inner:{type:"B"}})
```

[Online Flow-try](https://flow.org/try/#0KYDwDg9gTgLgBDAnmYcCSA7DwoBVnACCcAvHAN4BQcCBAXHAESGMA0lAvgNyWWiSxaKdFhz4UAIVIVqQ4A0YS2nHn3DR4SYZmx4C0nWILEAPiN3jgE1VtQB5AK4wjKADy4GhvSgB80qjQAlqJQDLjs3Lz8GnJwjs7eRNLxLsCuXpaEPjzRgrZxTqlSZCmJ6SGWEtm8AGYOGADGMIEQGAjAAM4wABQAhgyllQCUFByUdY3Nre1dAEzuPn0DhWW4PiPkY+P1TS1tAEbunhUEi-0FCZYLG7KBNXB9AHTBuo-5JB9MSjc0NAD0fzgABEIJ0MAByeAAd2gAGs6LIaM4un0hqpfnAAXAAOpwjqsOBQgAWgQaRLgAFtgL0MB0EETUC8cHAoMAasFgFSMPBAnSuoEADYC+k4YCIzGA5E9chM0JwXrPEIcNHi8VY3FQWH4wkksmU6m0kVwCArFlsjlcnl03oCjoQEWsgD8aslnRgs1RPBoYy2+26MpCdHItjoikYHGVQA).

This doesn't seem to be expected "pessimistic refinement" behaviour, since no other function calls happen between the guard and the type check.

Beitragsleitfaden

Beitragsleitfaden öffnen

Bewertung

Dieses Issue wurde noch nicht bewertet.

Neue Issues direkt in Ihr Postfach

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