TypeScript Generics

Using generics for reusable code

Generic Function

function identity<T>(value: T): T { # generic type parameter
    return value;
}
let result = identity<string>('hello'); # explicit type
let result2 = identity(42); # inferred type

Generic Interface

interface Box<T> { # generic interface
    value: T;
}
let box: Box<number> = { value: 10 };

Generic Class

class Container<T> { # generic class
    constructor(private value: T) { }
    
    getValue(): T {
        return this.value;
    }
}
let container = new Container<string>('hello');

Generic Constraints

interface HasLength {
    length: number;
}
function logLength<T extends HasLength>(value: T) { # constrain type
    console.log(value.length);
}

Multiple Type Parameters

function pair<T, U>(first: T, second: U): [T, U] { # multiple generics
    return [first, second];
}