Generic

Generic Types

function identity<T>(arg: T): T {
  return arg;
}

let myIdentity: <T>(arg: T) => T = identity; // ok
let myIdentity: <U>(arg: U) => U = identity; // ok
let myIdentity: { <T>(arg: T): T } = identity; // ok

interface GenericIdentityFn {
  <T>(arg: T): T;
}
let myIdentity: GenericIdentityFn = identity; // ok

Generic Constraints

extends interface

interface HasLength {
    length: number
}

function count<T extends HasLength>(element: T): number {
    return element.length;
}

Using Type Parameters in Generic Constraints

keyof

function getProperty<T, K extends keyof T>(obj: T, key: K) {
  return obj[key];
}

Generic Classes

function getProperty<T, K extends keyof T>(obj: T, key: K) {
  return obj[key];
}