TypeScript Basic Types: Primitive, Special, Interfaces, Arrays & Tuples
1. What are the primitive types in TypeScript?
Primitive types are the basic building blocks for data in TypeScript, inherited from JavaScript.
- number: Represents both integers and floating-point numbers (e.g.,
42,3.14). - string: Represents textual data (e.g.,
"hello",'world'). - boolean: Represents
trueorfalse.
Use Case: Declaring variables with simple, predictable data types.
Note: TypeScript enforces type checking at compile time, unlike JavaScript.
Can you give an example of primitive types?
// Primitive types: number, string, boolean
let age: number = 25;
let name: string = "kristal";
let isActive: boolean = true;
console.log(`Name: ${name}, Age: ${age}, Active: ${isActive}`);
// Type errors (uncomment to see errors)
// age = "30"; // Error: Type 'string' is not assignable to type 'number'
// isActive = 1; // Error: Type 'number' is not assignable to type 'boolean'
Output (when compiled to JavaScript and run):
Name: kristal, Age: 25, Active: true
2. What are the special types in TypeScript?
- any: Disables type checking, allowing any value. Use sparingly to avoid losing type safety.
- unknown: Safer alternative to
any; requires type checking before use. - void: Indicates a function returns no value.
- null: Represents an intentional absence of value.
- undefined: Represents an uninitialized variable.
- never: Represents values that never occur (e.g., functions that always throw or never return).
Use Case: Handling edge cases, dynamic data, or function return types.
Can you give an example of special types?
// Special types
let anyValue: any = 42;
anyValue = "hello"; // No error
let unknownValue: unknown = 42;
// console.log(unknownValue.length); // Error: 'length' does not exist on type 'unknown'
if (typeof unknownValue === "string") {
console.log(unknownValue.length); // Safe after type check
}
function logMessage(): void {
console.log("No return value");
}
let nullValue: null = null;
let undefinedValue: undefined = undefined;
function throwError(message: string): never {
throw new Error(message);
}
// Example usage
logMessage();
console.log(`Any: ${anyValue}, Null: ${nullValue}, Undefined: ${undefinedValue}`);
// Never example (uncomment to see error handling)
// throwError("Test error");
Output (when compiled and run):
No return value
Any: hello, Null: null, Undefined: undefined
3. What are type annotations and interfaces in TypeScript?
Type Annotations: Explicitly specify a variable’s type using : Type.
- Example:
let age: number = 25;
Interfaces: Define the structure of objects, specifying property types and optional methods.
- Syntax:
interface Name { property: Type; method?(): ReturnType; } - Can include optional properties (
?), readonly properties, and function signatures.
Use Case: Ensuring consistent object shapes and type safety in functions or classes.
Can you give an example of type annotations and interfaces?
// Type annotations and interfaces
interface Employee {
name: string;
id: number;
salary?: number; // Optional property
getDetails(): string;
}
// Type annotation with interface
let employee: Employee = {
name: "Sashi",
id: 101,
getDetails() {
return `${this.name} (ID: ${this.id})`;
}
};
// Function with interface
function printEmployee(emp: Employee): void {
console.log(emp.getDetails());
if (emp.salary) {
console.log(`Salary: $${emp.salary}`);
}
}
// Usage
printEmployee(employee);
employee.salary = 60000;
printEmployee(employee);
Output:
Sashi (ID: 101)
Sashi (ID: 101)
Salary: $60000
4. What are arrays and tuples in TypeScript?
Arrays: Ordered collections of elements of the same type.
- Syntax:
Type[]orArray<Type>. - Example:
let numbers: number[] = [1, 2, 3];.
Tuples: Fixed-length arrays with specific types for each position.
- Syntax:
[Type1, Type2, ...]. - Example:
let pair: [string, number] = ["kristal", 25];.
Use Case: Arrays for homogeneous data; tuples for fixed, heterogeneous data.
Can you give an example of arrays and tuples?
// Arrays and tuples
let numbers: number[] = [1, 2, 3, 4];
let names: Array<string> = ["kristal", "Sashi"];
// Array operations
numbers.push(5);
console.log(`Numbers: ${numbers}`);
// Tuple
let person: [string, number, boolean] = ["hari", 30, true];
// Tuple access
console.log(`Person: Name=${person[0]}, Age=${person[1]}, Active=${person[2]}`);
// Type error (uncomment to see)
// person[0] = 123; // Error: Type 'number' is not assignable to type 'string'
Output:
Numbers: 1,2,3,4,5
Person: Name=hari, Age=30, Active=true
5. Can you provide a comprehensive example of TypeScript basic types?
Project Structure:
ts-types-example/
├── src/
│ └── main.ts
├── tsconfig.json
└── package.json
main.ts:
// Comprehensive example of TypeScript basic types
interface User {
id: number;
name: string;
scores: number[];
profile: [string, number]; // [department, years]
logInfo?(): void;
}
// Function with type annotations and special types
function processUser(user: User, defaultStatus: string = "active"): string | never {
if (!user.name) {
throw new Error("Name is required");
}
let status: any = defaultStatus; // Flexible but unsafe
let unknownData: unknown = user.scores;
// Type narrowing for unknown
if (Array.isArray(unknownData)) {
const avgScore: number = unknownData.reduce((a, b) => a + b, 0) / unknownData.length;
return `${user.name} (ID: ${user.id}), Dept: ${user.profile[0]}, Years: ${user.profile[1]}, Avg Score: ${avgScore}, Status: ${status}`;
}
return "Invalid data";
}
// Example usage
const user: User = {
id: 101,
name: "kristal",
scores: [85, 90, 95],
profile: ["Engineering", 5],
logInfo() {
console.log(`Logging: ${this.name}`);
}
};
try {
console.log(processUser(user));
user.logInfo();
// Using null/undefined
let temp: null = null;
let unassigned: undefined = undefined;
console.log(`Temp: ${temp}, Unassigned: ${unassigned}`);
} catch (error: unknown) {
console.log(`Error: ${(error as Error).message}`);
}
package.json:
{
"name": "ts-types-example",
"version": "1.0.0",
"scripts": {
"start": "tsc && node dist/main.js",
"build": "tsc",
"watch": "tsc --watch"
},
"devDependencies": {
"typescript": "^5.6.2"
}
}
tsconfig.json:
{
"compilerOptions": {
"target": "ES2020",
"module": "NodeNext",
"outDir": "./dist",
"rootDir": "./src",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true
},
"include": ["src/**/*"],
"exclude": ["node_modules"]
}
Steps to Run:
- Create the project structure.
- Install dependencies:
npm install. - Compile:
npm run build. - Run:
npm start.
Output:
kristal (ID: 101), Dept: Engineering, Years: 5, Avg Score: 90, Status: active
Logging: kristal
Temp: null, Unassigned: undefined
Description:
- Primitive Types: Used for
id(number),name(string), and within arrays/tuples. - Special Types:
anyfor flexiblestatus,unknownfor safescoreshandling,voidforlogInfo,null/undefinedfor edge cases,neverfor error throwing. - Interfaces:
Userdefines object structure with optionallogInfo. - Arrays/Tuples:
scoresasnumber[],profileas[string, number]. - Type Annotations: Used throughout for variables and function parameters.
6. What are common mistakes in TypeScript basic types?
- Primitive Types:
- Forgetting type annotations, leading to implicit
any. - Mixing incompatible types (e.g., assigning
stringtonumber).
- Forgetting type annotations, leading to implicit
- Special Types:
- Overusing
any, undermining type safety. - Not narrowing
unknownbefore accessing properties. - Using
voidincorrectly for functions returning values.
- Overusing
- Type Annotations/Interfaces:
- Defining incomplete interfaces, missing required properties.
- Not using optional properties (
?) when appropriate.
- Arrays/Tuples:
- Using arrays when tuples are needed for fixed-length data.
- Ignoring tuple type order, causing type errors.
- General:
- Not enabling
strictmode (strict: trueintsconfig.json). - Ignoring TypeScript compiler errors.
- Not enabling
7. What are best practices for TypeScript basic types?
- Primitive Types:
- Always specify types (e.g.,
: number) to avoid implicitany. - Use const assertions for literals (e.g.,
as const).
- Always specify types (e.g.,
- Special Types:
- Prefer
unknownoveranyfor safer dynamic typing. - Use
voidfor functions with no return value. - Reserve
neverfor exhaustive checks or error-throwing functions.
- Prefer
- Type Annotations/Interfaces:
- Define interfaces for complex object shapes.
- Use optional properties and
readonlymodifiers where needed.
- Arrays/Tuples:
- Use
Type[]for arrays;[Type1, Type2]for tuples. - Validate tuple lengths and types strictly.
- Use
- General:
- Enable
strictmode intsconfig.jsonfor maximum type safety. - Use type narrowing (e.g.,
typeof,instanceof) forunknown. - Document interfaces with comments for clarity.
- Test with edge cases (e.g.,
null,undefined, invalid types). - Use
tsc --noEmitto check types without generating JavaScript.
- Enable