Skip to content

TypeScript中的泛型

function add<T>(x: T, y: T): T {
    let result: T = (x as any) + (y as any);
    return result;
}

let sum = add<number>(1, 2); // 得到数字3
let concatenation = add<string>('1', '2'); // 得到字符串12

// let result = add<number>(1, true); // 错误,布尔值true的类型不是number
let result1 = add<boolean>(true, true); // 得到数字2

泛型函数(Generic Function),其名字后面的一对尖括号及尖括号内的字母T是其作为泛型函数的标志。
其中,字母T称为类型参数(Type Parameter),代表一个(定义时未知的)类型,在整个函数的定义过程中都可以当作类型使用

// 使用类型约束
function add<T extends number | string>(x: T, y: T): T {
    return (x as any) + (y as any);
}

let sum = add(1, 2); // 得到数字3
let concatenation = add('1', '2'); // 得到字符串12
// let result = add<boolean>(true, true); // 错误,boolean不兼容于number | string
// let result1 = add(false, false); // 错误,推断类型Boolean不兼容于number | string

class Biology {
    name: string;
}

class ObjectFactory<T extends Biology> {
    constructor(constructor: new () => T) {
    }
    // ...省略的代码
}

接口

对象接口

// 计算器对象接口
interface ICalculator<T> {
    add(x: T, y: T): T;
}

// 数字计算器类
class NumericCalculator implements ICalculator<number> {
    add(x: number, y: number): number {
        return x + y;
    }
}

// 字符串计算器类
class StringCalculator implements ICalculator<string> {
    add(x: string, y: string): string {
        return x + y;
    }
}

// 泛型计算器类
class Calculator<T> implements ICalculator<number> {
    add(x: number, y: number): number {
        return (x as any) + (y as any);
    }
}

// 另一个泛型计算器类
class Calculator1<T> implements ICalculator<T> {
    add(x: T, y: T): T {
        return (x as any) + (y as any);
    }
}

函数接口

// 泛型函数add()的类型接口
interface TypeOfAdd<T> {
    (x: T, y: T): T;
}

let add: TypeOfAdd<number> = (x: number, y: number) => x + y; // 数字加法运算函数
let add1: TypeOfAdd<string> = (x: string, y: string) => x + y; // 字符串拼接函数

let add2: <T>(x: T, y: T) => T;
add2 = <T>(x: T, y: T) => (x as any) + (y as any); // 数字加法运算或字符串拼接函数
add2<number>(1, 2); // 得到数字3
add2<string>('1', '2'); // 得到字符串12

类接口

// 泛型计算器类
class Calculator<T>  {
    add(x: T, y: T): T {
        return (x as any) + (y as any);
    }
}

// 泛型计算器类的类型接口
interface TypeOfCalculator {
    new <T>(): Calculator<T>
}

// 定义值为泛型计算器类的变量,并使用它来创建计算器对象
let genericCalculator: TypeOfCalculator = Calculator;
let calculator: Calculator<number> = new genericCalculator<number>();
calculator.add(1, 2); // 得到数字3