what is Generic Type Parameter to the Function in typescript

Umar Farooque Khan
4 min readJul 4, 2023

--

Generic Type

A generic type parameter in TypeScript allows you to create functions, classes, or interfaces that can work with different data types while preserving type safety. It enables you to write reusable code that can handle a variety of input types without sacrificing type checking and inference.

Let’s dive into a comprehensive explanation of generic type parameters in TypeScript, along with an example.

Understanding Generic Type Parameters

In TypeScript, a generic type parameter is denoted by a type variable, typically represented by a single uppercase letter, such as T, U, or V. It serves as a placeholder for a specific type that will be determined when the function or class is used or instantiated.

Generic type parameters can be applied to functions, classes, and interfaces, providing flexibility and re-usability for your code.

Using Generic Type Parameters in Functions

Let’s start with an example of a generic function that demonstrates the usage of a generic type parameter:

function identity<T>(arg: T): T {
return arg;
}
const result1 = identity<number>(10); // explicitly specifying the type argument
const result2 = identity("hello"); // type inference, T is inferred as string

In this example, the function identity takes a single argument arg of type T, and it returns a value of the same type T. The generic type parameter <T> is declared between angle brackets before the function parameters.

By using a generic type parameter, we can pass arguments of different types to the identity function while preserving the type safety. In the example, we explicitly specify the type argument as number for the first call, and for the second call, TypeScript infers the type as string based on the argument provided.

Extending Generic Type Parameters

Generic type parameters can also be constrained to specific types or interfaces using the extends keyword. This allows you to enforce that the provided types satisfy certain conditions. Here's an example:

interface Lengthwise {
length: number;
}
function printLength<T extends Lengthwise>(arg: T): void {
console.log(arg.length);
}
printLength("hello"); // Output: 5
printLength([1, 2, 3]); // Output: 3
printLength({ length: 10 }); // Output: 10

In this example, we define an interface Lengthwise that specifies a property length of type number. The generic function printLength is constrained with T extends Lengthwise, meaning T can only be a type that extends the Lengthwise interface.

By applying this constraint, we can guarantee that any argument passed to the printLength function has a length property of type number. TypeScript will provide type inference and ensure that only compatible types are used.

Generic Type Parameters in Classes

Generic type parameters can also be used in classes to create reusable components. Here’s an example:

class Box<T> {
private value: T;
constructor(value: T) {
this.value = value;
}
getValue(): T {
return this.value;
}
}
const box1 = new Box<number>(10);
console.log(box1.getValue()); // Output: 10
const box2 = new Box<string>("hello");
console.log(box2.getValue()); // Output: hello

In this example, we define a generic class Box that takes a type parameter T. The class has a private property value of type T, and a constructor that initializes the value.

We can create instances of Box by specifying the type argument when instantiating the class. The type safety ensures that the assigned value and the returned value from the getValue method match the specified type.

Multiple Generic Type Parameters

You can use multiple generic type parameters in functions, classes, or interfaces to handle complex scenarios. Here’s an example with multiple type parameters:

function mergeArrays<T, U>(arr1: T[], arr2: U[]): (T | U)[] {
return [...arr1, ...arr2];
}
const numbers = [1, 2, 3];
const strings = ["hello", "world"];
const mergedArray = mergeArrays(numbers, strings);
console.log(mergedArray); // Output: [1, 2, 3, "hello", "world"]

In this example, the function mergeArrays takes two arrays arr1 and arr2, which can be of different types T and U respectively. The function concatenates the two arrays and returns a new array of type (T | U)[], which allows for elements of either type.

Using multiple generic type parameters enables you to handle scenarios where functions or components need to work with multiple types simultaneously.

Type Inference with Generic Type Parameters

TypeScript provides powerful type inference capabilities when using generic type parameters. It automatically infers the type arguments based on the provided arguments or context, eliminating the need for explicit type annotations in many cases.

For example:

function identity<T>(arg: T): T {
return arg;
}
const result = identity(10); // TypeScript infers T as number

In this case, TypeScript automatically infers that T is number based on the argument passed to the identity function.

Benefits of Generic Type Parameters

The use of generic type parameters in TypeScript offers several benefits:

  1. Re usability: Generic code can be used with different types, promoting code reuse and reducing duplication.
  2. Type Safety: TypeScript’s type system ensures that generic code is used correctly and provides compile-time type checking, preventing potential type errors.
  3. Flexibility: Generic code allows for a wide range of types to be handled, offering flexibility in the design and usage of functions, classes, or interfaces.
  4. Type Inference: TypeScript’s type inference capabilities infer the generic type arguments based on the provided context, reducing the need for explicit type annotations.
  5. Code Readability: Generic type parameters make code more expressive and self-documenting by indicating the intended flexibility and behaviour.

Conclusion

Generic type parameters in Type Script enable you to create flexible, reusable, and type-safe code that can work with different types. They provide the ability to write generic functions, classes, and interfaces that adapt to a wide range of data types, ensuring type safety and promoting code reuse. By leveraging generic type parameters, you can write more expressive and robust code in TypeScript.

--

--

Umar Farooque Khan
Umar Farooque Khan

Written by Umar Farooque Khan

Experienced software developer with a passion for clean code and problem-solving. Full-stack expertise in web development. Lifelong learner and team player.

No responses yet