Ich arbeite an der Verbesserung der Defs für Rosie, die derzeit sehr auf any
verlassen und bieten nicht viel in Bezug auf die Sicherheit. Ich bin im Moment ein bisschen fest und könnte einen Ratschlag gebrauchen.TypeScript Generics und Funktionsargumente
Ich versuche, eine Signatur zu schreiben, das die folgenden zum Ausdruck bringt:
// this is invalid, but something like this is the goal
interface IFactory<T = any> {
attr<K extends keyof T, D extends keyof T>(name: K, dependencies: D[], generatorFunction: (value1?: D[0], value2?: D[1], value3?: D[2]), value4?: D[3] => T[K]): IFactory<T>;
}
Eine Reihe von Tasten in der zweiten Argument angegeben wird. Die Werte davon werden als Argumente an die Funktion in der gleichen Reihenfolge übergeben. Ich will, um unnötige Art Abgüsse zu vermeiden, also sollten wir diese:
Factory.define<Person>('Person').attr('fullName', ['firstName', 'lastName', 'age'], (firstName, lastName, age) => {
// it knows that firstName is a string, lastName is a string, age is a number
if (age > 10) {
// this will error
return age;
}
return `${firstName} ${lastName};
});
Der nächstgelegene ich bekommen kann, ist dies:
attr<K extends keyof T, D extends keyof T>(name: K, dependencies: D[], generatorFunction: (value1: T[D], value2: T[D], value3: T[D], value4: T[D]) => T[K]): IFactory<T>;
zu 4 abhängige Werte abtippen, sondern nannte es bedarf der ausdrücklichen Abgüsse und Arten in der richtigen Reihenfolge nicht festgelegt:
// it knows that each of the three arguments are string | number
existingDefinition.attr('fullName', ['firstName', 'lastName', 'age'], (firstName: string, lastName: string, age: number) => `${firstName} ${lastName}`);
Dies macht es mir möglich, die Reihenfolge der Abhängigkeiten zu ändern, ohne es zu zerbrechen, was nicht gut ist. Es gibt auch keinen Fehler, wenn ich mehr Argumente als abhängige Werte zur Verfügung stelle. Ich würde gerne einen Weg finden zum Ausdruck zu bringen "generatorFunction
hat ein Argument für jedes Element in dependencies
, vom Typ T[DependencyName]
."
Ich hoffe, das macht Sinn. Schätze jede Hilfe, die jemand anbieten kann.
Ich bin mir ziemlich sicher, dass es nicht möglich ist, es auf eine universelle Weise zu tun. Stattdessen sollten Sie separate Überladungen für 1,2,3, ... Parameter erstellen. Die maximale Anzahl sollte Ihren Anforderungen entsprechen. – MistyK