Typescript
Typescript
How to Typescript
This fastest way to Typescript town, more paths are listed after
Static Typing
TypeScript adds static typing to JavaScript. You must declare types for variables, function parameters, and return values.
let x: number = 10; let name: string = "Alice"; let isActive: boolean = true;
Type Inference
TypeScript can infer types automatically if you initialize a variable with a value.
let x = 10; // TypeScript infers x as number let name = "Alice"; // TypeScript infers name as string
Union Types
TypeScript allows variables to have multiple types using the | operator.
let value: number | string; value = 10; // Valid value = "Hello"; // Also valid
Interfaces
Interfaces define the structure of objects. They are used for type-checking.
interface Person {
name: string;
age: number;
}
const person: Person = {
name: "Alice",
age: 25
};Type Aliases
Type aliases allow you to create custom types. They are similar to interfaces but can represent any type.
type Point = {
x: number;
y: number;
};
const p: Point = { x: 10, y: 20 };Generics
Generics allow you to create reusable components that work with multiple types.
function identity<T>(arg: T): T {
return arg;
}
let output = identity<string>("Hello"); // Output is of type stringEnums
Enums allow you to define a set of named constants. They make code more readable.
enum Direction {
Up,
Down,
Left,
Right
}
let dir: Direction = Direction.Up;Optional and Default Parameters
Function parameters can be optional or have default values.
function greet(name: string, age?: number) {
console.log(`Hello, ${name}`);
}
greet("Alice"); // age is optionalType Assertions
Type assertions allow you to override TypeScript's inferred type.
let value: any = "Hello"; let length: number = (value as string).length;
Tuples
Tuples allow you to define an array with fixed types and lengths.
let tuple: [string, number]; tuple = ["Alice", 25]; // Valid tuple = [10, "Alice"]; // Error
Readonly Properties
Properties marked as readonly cannot be modified after initialization.
interface Person {
readonly name: string;
age: number;
}
const person: Person = { name: "Alice", age: 25 };
person.name = "Bob"; // Error: Cannot assign to 'name'Decorators
Decorators are a special kind of declaration that can be attached to classes, methods, or properties.
function log(target: any, key: string) {
console.log(`${key} was called`);
}
class Person {
@log
greet() {
console.log("Hello!");
}
}Namespaces
Namespaces are used to group related code and avoid naming collisions.
namespace MathUtils {
export function add(a: number, b: number): number {
return a + b;
}
}
console.log(MathUtils.add(10, 20)); // 30Type Guards
Type guards allow you to narrow down the type of a variable within a conditional block.
function isString(value: any): value is string {
return typeof value === "string";
}
let value: string | number = "Hello";
if (isString(value)) {
console.log(value.toUpperCase()); // Safe to call string methods
}Utility Types
TypeScript provides built-in utility types like Partial, Pick, and Omit to manipulate types.
interface Person {
name: string;
age: number;
}
type PartialPerson = Partial<Person>; // All properties are optional
type NameOnly = Pick<Person, "name">; // Only the 'name' propertyStrict Null Checks
TypeScript's strictNullChecks flag ensures that null and undefined are handled explicitly.
let x: number; x = null; // Error if strictNullChecks is enabled
Declaration Files
Declaration files (.d.ts) are used to describe the shape of existing JavaScript libraries.
// myLibrary.d.ts
declare module "myLibrary" {
export function doSomething(): void;
}TypeScript with React
TypeScript integrates seamlessly with React, providing type safety for props and state.
interface Props {
name: string;
age: number;
}
const Greet: React.FC<Props> = ({ name, age }) => (
<div>Hello, {name}! You are {age} years old.</div>
);Core Concepts
Type Annotations
// ๐ท๏ธ Explicit type declarations let age: number = 25; let name: string = "Alice"; let isActive: boolean = true; // ๐งฉ Array types let numbers: number[] = [1, 2, 3]; let mixed: (string | number)[] = ["text", 42];
Interfaces
// ๐ Object shape definition
interface User {
id: number;
name: string;
email?: string; // Optional property
}
// ๐จ๏ธ Usage
const user: User = { id: 1, name: "John" };Enums
// ๐ข Named constants
enum Direction {
Up = 'UP',
Down = 'DOWN',
}
// ๐งญ Usage
const move: Direction = Direction.Up;Type System
Union & Intersection
// ๐ค Combine types
type ID = string | number;
type Admin = User & { privileges: string[] };Type Guards
// ๐ Runtime type checking
function isString(val: any): val is string {
return typeof val === 'string';
}
// ๐ก๏ธ Safe type usage
if (isString(input)) {
console.log(input.toUpperCase());
}Advanced Types
Generics
// ๐งช Reusable type variables
function identity<T>(arg: T): T {
return arg;
}
// ๐ฆ Generic interfaces
interface Box<T> {
content: T;
}Utility Types
// ๐ ๏ธ Built-in type helpers type PartialUser = Partial<User>; type ReadonlyUser = Readonly<User>; type StringKeys = keyof User;
Object-Oriented Programming
Classes
// ๐๏ธ Class with modifiers
class Animal {
private name: string;
protected age: number;
constructor(name: string) {
this.name = name;
}
public move(): void {
console.log("Moving");
}
}Decorators
// ๐ Metadata annotations
function log(target: any, key: string) {
console.log(`Method ${key} called`);
}
class Calculator {
@log
add(a: number, b: number) { return a + b; }
}Configuration
tsconfig.json
// โ๏ธ Core compiler options
{
"compilerOptions": {
"target": "ES2020",
"module": "CommonJS",
"strict": true,
"outDir": "./dist"
}
}Best Practices
Type Narrowing
// ๐ฆ Precise type control
function printId(id: string | number) {
if (typeof id === 'string') {
console.log(id.toUpperCase());
} else {
console.log(id.toFixed(2));
}
}Type Assertions
// โ ๏ธ Use with caution
const element = document.getElementById('root') as HTMLElement;
const value = <number>someUnknownValue;Why Solo Dev?
This reference website is not for beginners
Solo Dev is strictly for devs who already know the game and need a beautiful cheat sheet on their second monitor which looks better than GeeksforGeeks
this portion goes away when you shrink the screen ;)
