Deklarationszusammenführung (Declaration Merging) — ein einzigartiger Mechanismus in TypeScript, der es ermöglicht, Deklarationen mit demselben Namen zu einem einzigen Typ/Entität zusammenzuführen. Dies funktioniert für Schnittstellen, Namensräume und Funktionen.
interface User { name: string; } interface User { age: number; } const u: User = { name: 'Vasya', age: 42 }; // OK
function helper() {} namespace helper { export function extra() {} } helper.extra(); // OK
Wie erfolgt die Zusammenführung von Methoden mit denselben Namen in verschiedenen Bereichen der Schnittstelle, und was passiert, wenn deren Signaturen unterschiedlich sind?
Antwort:
Wenn Sie in verschiedenen zusammengeführten Schnittstellen Methoden mit demselben Namen deklarieren, wird TypeScript versuchen, diese Methoden im endgültigen Interface „zu überladen“. Wenn die Signaturen jedoch nicht kompatibel sind (nicht überladen werden können), führt dies zu einem Kompilierungsfehler.
Beispiel:
interface Foo { bar(a: number): void } interface Foo { bar(a: string): void } // OK: Überladungen interface Foo { bar(a: number[]): void } // Fehler: nicht kompatible Signaturen
Geschichte
In einem Projekt wurde das externe Interface Window durch Deklarationszusammenführung für verschiedene Features erweitert: Ein Team fügte window.myFeature: boolean hinzu, ein anderes window.myFeature: number. Die Zusammenführung verursachte einen Typfehler, und der Compiler erkannte den Konflikt erst bei der allgemeinen Zusammenstellung — jemand musste schnell umbenennen.
Geschichte
Aus Versehen wurden zwei Schnittstellen ArrayHelper mit unterschiedlichen Methodensignaturen deklariert, in der Erwartung, dass sie „beide Optionen verfügbar“ sein würden. In Wirklichkeit überdeckte die erste Signatur die zweite, was zu falscher Autovervollständigung in der IDE und einem Bug während der Integration mit dem neuen Modul führte.
Geschichte
Bei der Verwendung eines Namensraums zur „Erweiterung“ einer Funktion durch Deklarationszusammenführung deklarierte der Entwickler export innerhalb des Namensraums falsch, und die Funktion war nicht verfügbar. Erst nach der Überprüfung stellte sich heraus, dass ohne den richtigen Export die Zusammenführung nicht funktioniert und die Eigenschaften nicht zur Funktion hinzugefügt werden.