📖 Scenario: You are building a simple app to store the number of items sold for different products in a store. The product names are not fixed and can change dynamically.
🎯 Goal: Create a TypeScript object that can hold product names as keys and their sold quantities as values using index signatures. Then, add some products and their quantities, and finally print the total quantity sold.
📋 What You'll Learn
Create an interface called SalesRecord with an index signature for string keys and number values.
Create a variable called sales of type SalesRecord.
Add three products with exact names and quantities: 'apple': 10, 'banana': 5, 'orange': 8.
Create a variable called totalSold to hold the sum of all quantities.
Use a for...in loop to iterate over sales and sum the quantities into totalSold.
Print the total quantity sold using console.log.
💡 Why This Matters
🌍 Real World
Stores and inventory systems often need to track quantities of products where product names can change or be added dynamically.
💼 Career
Understanding index signatures helps in building flexible TypeScript applications that handle dynamic data structures, common in web development and backend services.
Progress0 / 4 steps
1
Create the SalesRecord interface
Create an interface called SalesRecord with an index signature that allows string keys and number values.
Typescript
Hint
Use [key: string]: number; inside the interface to allow dynamic keys.
2
Create the sales object with products
Create a variable called sales of type SalesRecord and assign it an object with these exact entries: 'apple': 10, 'banana': 5, 'orange': 8.
Typescript
Hint
Use const sales: SalesRecord = { ... } to create the object with the exact keys and values.
3
Calculate total quantity sold
Create a variable called totalSold and set it to 0. Then use a for...in loop with variable product to iterate over sales and add each quantity to totalSold.
Typescript
Hint
Initialize totalSold to 0. Use for (const product in sales) to loop through keys and add sales[product] to totalSold.
4
Print the total quantity sold
Use console.log to print the value of totalSold.
Typescript
Hint
Use console.log(totalSold); to display the total quantity sold.
Practice
(1/5)
1. What is the main purpose of an index signature in TypeScript when working with objects?
easy
A. To create arrays with fixed length
B. To define fixed keys with different types for each key
C. To restrict objects to only one key-value pair
D. To allow objects to have dynamic keys with values of a specific type
Solution
Step 1: Understand index signatures
Index signatures let you define objects that can have any number of keys, but all keys must have values of the same type.
Step 2: Compare options
To allow objects to have dynamic keys with values of a specific type correctly describes this purpose. Options B, C, and D describe other unrelated concepts.
Final Answer:
To allow objects to have dynamic keys with values of a specific type -> Option D
Quick Check:
Index signature = dynamic keys with uniform value type [OK]
Hint: Index signatures mean dynamic keys with same value type [OK]
Common Mistakes:
Thinking index signatures fix keys instead of allowing dynamic keys
Confusing index signatures with tuple or array types
Assuming index signatures restrict to one key-value pair
2. Which of the following is the correct syntax for an index signature allowing string keys and number values in TypeScript?
easy
A. { [key: string]: number }
B. { key: string; value: number }
C. { [key: number]: string }
D. { key: number; value: string }
Solution
Step 1: Recall index signature syntax
The syntax is { [key: KeyType]: ValueType }. For string keys and number values, it is { [key: string]: number }.
Step 2: Check options
{ [key: string]: number } matches the correct syntax. { [key: number]: string } reverses key and value types. Options B and D are object properties, not index signatures.
Final Answer:
{ [key: string]: number } -> Option A
Quick Check:
Index signature syntax = {[key: string]: number} [OK]
Hint: Index signature syntax: {[key: KeyType]: ValueType} [OK]
Common Mistakes:
Swapping key and value types in the signature
Using object property syntax instead of index signature
Using number keys when string keys are intended
3. Given the following TypeScript code, what will be the output of console.log(userScores['alice'])?
The interface allows any string key with number values. The object has keys 'alice' and 'bob' with values 10 and 15.
Step 2: Access the value for key 'alice'
Accessing userScores['alice'] returns 10, the value assigned to 'alice'.
Final Answer:
10 -> Option A
Quick Check:
userScores['alice'] = 10 [OK]
Hint: Access dynamic key value directly with bracket notation [OK]
Common Mistakes:
Confusing key with value and expecting 'alice' as output
Assuming undefined for existing keys
Mixing up values of different keys
4. Identify the error in the following TypeScript code using an index signature:
interface Data {
[key: string]: number;
}
const data: Data = {
id: 1,
name: "John"
};
medium
A. The interface should use [key: number] instead
B. The value of 'name' is a string, but should be a number
C. Index signatures cannot use string keys
D. The key 'id' should be a number, not a string
Solution
Step 1: Check index signature type
The interface says all keys (strings) must have number values.
Step 2: Check object values
The 'id' key has value 1 (number), which is correct. The 'name' key has value "John" (string), which violates the number value rule.
Final Answer:
The value of 'name' is a string, but should be a number -> Option B
Quick Check:
Value types must match index signature [OK]
Hint: All values must match index signature type [OK]
Common Mistakes:
Thinking keys must be numbers instead of strings
Ignoring value type mismatch errors
Assuming index signatures allow mixed value types
5. You want to create a TypeScript object to store user preferences where keys are user IDs (numbers) and values are objects with dynamic string keys and boolean values. Which of the following interface definitions correctly models this?
We need an object with number keys (user IDs) and values that are objects with string keys and boolean values.
Step 2: Match interface to requirement
interface Preferences { [userId: number]: { [prefKey: string]: boolean } } uses an index signature for userId as number keys, and nested index signature for preference keys as strings with boolean values, matching the requirement exactly.