Ich habe eine Funktion, die mehrmals aufgerufen wird.Funktion Parameter Typ
function foo(parameter) {
parameter.a;
parameter.b;
parameter.c;
parameter.d;
}
Die Argumente sind für jeden Aufruf unterschiedlich, aber sie sind alle Literale und haben dieselbe Struktur.
const first = { a: 1, b: 2, c: 3, c: 4};
const second = { a: 2, b: 4, c: 6, c: 8};
foo(first);
foo(second);
Außerdem haben die Objekte eine Menge von Attributen und aus diesem Grund ist es mühsam manuell den Typ des Parameters angeben, die auf meine Frage führt: , wie die Art der foo
‚s schließen Parameter ? Der Compiler leitet die Typen first
und second
korrekt ab, scheint aber nicht auf den Typ parameter
zu schließen.
Hier ist, was ich versucht habe.
Sie können eine Instanz in die Typposition einfügen.
foo(parameter: typeof first) { parameter.a; parameter.b; //... }
Es funktioniert und der Typ ist richtig, aber ich möchte mit diesem Ansatz zu vermeiden, da die Funktion und die Literale in verschiedenen Dateien definiert sind, und ich will nicht wörtlich in die Datei importieren mit Funktionsdefinition.
Wenn ich die Funktion in ein Lambda umwandeln, scheint der Compiler den Typ glücklich zu schließen. Es würde wie folgt aussehen:
function wrapper<T>(parameter: T, foo: (p: T) => void) { foo(parameter); } wrapper(first, parameter => { // parameter is inferred to be `typeof first`. parameter.a; parameter.b; //... })
Aber sobald ich die labmda in eine Variable extrahieren (was ich brauche, um die Funktion wieder zu verwenden), es wird gefolgert einem.
function wrapper<T>(parameter: T, foo: (p: T) => void) { foo(parameter); } const lambda = parameter => { // parameter is `any` parameter.a; parameter.b; //... } wrapper(first, lambda)
Ich hatte das gleiche Problem, Interface ist die offensichtliche Lösung, aber ... da wir viele Eigenschaften haben und wir bereits einige Objekt literal geschrieben haben ... und der Compiler abgeleitete den Typ ... können wir diesen abgeleiteten Typ nennen und damit den Typ anderer Objekt- und Funktionsargumente zu deklarieren? –