TypeScript používá strukturální typování ("duck typing"): dva typy jsou kompatibilní, pokud mají stejný tvar, bez ohledu na jejich název nebo místo deklarace. To kontrastuje s nominálním typováním (Java, C#), kde kompatibilita závisí na deklarovaném názvu typu.
interface Point { x: number; y: number; }
function print(p: Point) { console.log(p.x, p.y); }
// No `: Point` annotation anywhere, but the shape matches:
const obj = { x: 1, y: 2, z: 3 };
print(obj); // ✅ works — obj has x and y (extra z is fine)
obj nikdy nebyl deklarován jako Point, přesto je přijat, protože strukturálně splňuje tvar. Dodatečné vlastnosti jsou povoleny při předávání existující proměnné.
Výjimka kontroly nadměrných vlastností
print({ x: 1, y: 2, z: 3 }); // ❌ Error: 'z' does not exist in type 'Point'
Objektové literály předávané přímo dostávají přísnější "kontrolu nadměrných vlastností" pro zachycení překlepy — ale přiřaďte jej nejprve do proměnné a projde. Jde o záměrný kompromis mezi flexibilitou a zachycováním chyb.
Proč na tom záleží
Strukturální typování činí TypeScript flexibilní a ergonomní — můžete splnit rozhraní bez jeho explicitní implementace, což se hodí pro objektově-literálový styl JavaScriptu.
Kompromis: typy, které sdílejí tvar, jsou vzájemně zaměnitelné, i když nejsou koncepčně související (důvod, proč lidé používají značené typy, když potřebují nominálně podobnou odlišnost).
