Was wäre der richtige/bevorzugte Weg, Flussanmerkungen zu einer Funktion wie dieser hinzuzufügen?Funktion, die einem Objekt eine Eigenschaft hinzufügt
function addBar(foo) {
foo.bar = 10
return foo
}
Lassen Sie uns sagen, dass ich die folgenden Typen haben:
type Foo = { foo: string }
type FooBar = { foo: string, bar: number }
und ich würde die Funktion in einem Foo
nehmen möchten und eine FooBar
zurück.
Bisher sind die besten Lösungen, die ich habe kommen mit sind dies:
function addBar(foo: Foo): FooBar {
const fooBar: FooBar = { ...foo, bar: 10 }
return fooBar
}
, die eine Kopie des Objekts erstellt und stützt sich auf die Erholung Eigenschaften. Oder das:
function addBar(foo: Foo): FooBar {
const fooBar: FooBar = (foo: any)
fooBar.bar = 10
return fooBar
}
, die einige hacky Casting erfordert.
In der Theorie sollte dies ohne Gießen oder Kopieren erreichbar sein. Kann die dynamische Analyse von Flow dies erkennen? Und sind andere Ansätze für diesen Anwendungsfall besser geeignet?
Nun, Ändern des Typs eines vorhandenen Objekts durch Hinzufügen einer Eigenschaft * ist * hacky Casting. – Bergi
Im Allgemeinen modelliert Flow die Nebenwirkungen von Funktionsaufrufen nicht. Es gibt also keine Möglichkeit zu verstehen, dass das Aufrufen einer Funktion das Objekt, das Sie haben, verändert. Sie haben richtig erkannt, dass Flow durch das Erstellen einer Kopie verstehen kann, was vor sich geht. Wenn Sie genau das tun, was Sie wollen, müssen Sie das Typsystem umgehen (was in einigen Fällen in Ordnung ist - es liegt wirklich an Ihnen). –
Hmm, gute Punkte ... es erschien mir zunächst nicht hacky, weil ich es wahrscheinlich als eine Umwandlung dachte. Aber jetzt, wo ich daran denke, macht das Erstellen einer Kopie des Objekts Sinn, wenn es eine Umwandlung ist :) – mjomble