What if you could use any object just by knowing what it can do, not what it is?
Why Duck typing mental model in TypeScript? - Purpose & Use Cases
Imagine you have many different objects representing animals, vehicles, or gadgets, and you want to check if they can perform a certain action like quack or drive. Manually checking each object's exact type or class before using it can be confusing and slow.
Manually verifying types means writing lots of code to check each object's class or interface. This is slow, error-prone, and makes your code bulky. It also stops you from using objects that behave correctly but don't share the same exact type.
Duck typing lets you focus on what an object can do, not what it is. If it has the right properties or methods, TypeScript treats it as the correct type. This makes your code simpler, more flexible, and easier to maintain.
if (obj instanceof Duck) { obj.quack(); } else { throw new Error('Not a duck'); }
function makeItQuack(duck: { quack: () => void }) { duck.quack(); }It enables writing flexible code that works with any object that fits the expected shape, without strict type checks.
In a drawing app, you can pass any shape object that has a draw() method, whether it's a circle, square, or custom shape, without needing them to share a common class.
Duck typing focuses on an object's abilities, not its exact type.
This reduces complex type checks and makes code more flexible.
TypeScript uses this model to allow easy and safe use of objects with matching shapes.
Practice
Solution
Step 1: Understand duck typing concept
Duck typing means an object is accepted if it has the needed properties or methods, regardless of its declared type.Step 2: Compare with other options
The other options describe strict or class-based typing, which is not how TypeScript works.Final Answer:
If an object has the required properties or methods, it is accepted regardless of its explicit type. -> Option BQuick Check:
Duck typing = structural compatibility [OK]
- Thinking TypeScript requires class inheritance
- Confusing runtime type checks with compile-time checks
- Assuming exact type names must match
name string property and a quack() method returning void?Solution
Step 1: Check property and method types
Thenameproperty must be a string, andquackmust be a method returning void.Step 2: Validate each option
type Duck = { name: string; quack: () => void; }; correctly definesquackas a function returning void. The other options have incorrect method signatures or return types.Final Answer:
type Duck = { name: string; quack: () => void; }; -> Option AQuick Check:
Correct method signature = type Duck = { name: string; quack: () => void; }; [OK]
- Using method return type as property type
- Confusing void and string return types
- Incorrect interface method syntax
interface Duck { name: string; quack: () => void; }
function makeItQuack(duck: Duck) {
duck.quack();
}
const obj = { name: 'Daffy', quack: () => console.log('Quack!'), swim: () => console.log('Swim') };
makeItQuack(obj);Solution
Step 1: Check if obj matches Duck interface
obj hasname(string) andquack(function returning void), so it matches by duck typing.Step 2: Call makeItQuack with obj
Callingduck.quack()runsconsole.log('Quack!'), printing "Quack!".Final Answer:
Quack! -> Option DQuick Check:
Duck typing allows extra properties, output = Quack! [OK]
- Thinking extra properties cause errors
- Expecting 'Swim' output instead of 'Quack!'
- Assuming runtime type errors
interface Duck { name: string; quack: () => void; }
const notADuck = { name: 'Donald' };
function makeItQuack(duck: Duck) {
duck.quack();
}
makeItQuack(notADuck);Solution
Step 1: Check properties of notADuck
notADuck hasnamebut lacksquackmethod required by Duck interface.Step 2: Understand TypeScript type checking
TypeScript will report an error because notADuck does not satisfy the Duck type.Final Answer:
notADuck is missing the quack method required by Duck interface. -> Option AQuick Check:
Missing required method = Type error [OK]
- Ignoring missing methods in objects
- Assuming extra properties cause errors
- Thinking TypeScript allows missing required members
interface Duck { name: string; quack: () => void; }
const a = { name: 'Daisy', quack: () => console.log('Quack!') };
const b = { name: 'Goose', quack: 'loud' };
const c = { name: 'Swan', quack: () => 'quack' };
const d = { name: 'Mallard' };
function testDuck(duck: Duck) { duck.quack(); }Which call to
testDuck will NOT cause a TypeScript error?Solution
Step 1: Check each object's quack property type
a.quack is a function returning void (correct). b.quack is a string (wrong). c.quack is a function returning string (wrong return type). d.quack is missing (wrong).Step 2: Determine which matches Duck interface
Only object a matches the Duck interface exactly.Final Answer:
testDuck(a); -> Option CQuick Check:
Correct method signature only in a [OK]
- Accepting string or wrong return type as method
- Ignoring missing methods
- Confusing method return types
Ready to prove it?
Pass the test and this pattern moves unknown
