TypeScript泛型与类型约束实践 | 豆包MarsCode AI 刷题

76 阅读2分钟

TypeScript泛型与类型约束实践 | 豆包MarsCode AI 刷题

在青训营 X 豆包 MarsCode 技术训练营的学习中,我选择了方向三的实践记录与工具使用,特别是深入探索了TypeScript中的泛型和类型约束的应用。

TypeScript中的泛型:灵活与强类型的结合

TypeScript中的泛型提供了一种创建可重用组件的方式,这些组件不仅可以处理任何类型,还能保持强类型检查的优势。在学习过程中,我发现泛型在函数、接口和类中都能得到广泛应用。

  1. 泛型函数:通过使用泛型,我们可以创建一个能够处理多种类型的函数,而不需要为每种类型编写单独的函数。

typescript

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

let output1 = identity<string>("myString");
let output2 = identity<number>(100);
  1. 泛型接口:泛型接口允许我们在接口中使用参数化类型,从而使接口更加通用。

typescript

interface GenericIdentityFn<T> {
    (arg: T): T;
}

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

let myIdentity: GenericIdentityFn<number> = identity;
  1. 泛型类:泛型类可以创建一个通用的数据结构,例如栈或队列,使其能够处理不同的数据类型。

typescript

class GenericNumber<T> {
    zeroValue: T;
    add: (x: T, y: T) => T;
}

let myGenericNumber = new GenericNumber<number>();
myGenericNumber.zeroValue = 0;
myGenericNumber.add = function(x, y) { return x + y; };

类型约束:确保类型安全

在使用泛型时,有时我们需要对类型进行约束,以确保泛型只能使用某些特定类型。TypeScript允许我们使用extends关键字对泛型进行类型约束。

typescript

interface Lengthwise {
    length: number;
}

function loggingIdentity<T extends Lengthwise>(arg: T): T {
    console.log(arg.length);
    return arg;
}

loggingIdentity({ length: 10, value: 3 });

在这个例子中,泛型T被约束为必须具有length属性的类型,这样在函数中使用arg.length时就不会出现类型错误。

实践应用:创建一个泛型工具函数库

在实际项目中,我创建了一个小型的泛型工具函数库,帮助处理常见的数据操作任务。以下是一个示例函数,用于合并两个对象:

typescript

function merge<T, U>(obj1: T, obj2: U): T & U {
    let result = {} as T & U;
    for (let id in obj1) {
        (result as T)[id] = obj1[id];
    }
    for (let id in obj2) {
        if (!result.hasOwnProperty(id)) {
            (result as U)[id] = obj2[id];
        }
    }
    return result;
}

const merged = merge({ name: 'John' }, { age: 30 });
console.log(merged);

通过这种实践,我不仅加深了对TypeScript泛型的理解,还提高了代码的灵活性和可重用性。

总结

通过这次对TypeScript泛型与类型约束的探索,我充分体会到其在提高代码可维护性和安全性方面的优势。泛型使得代码更加灵活,而类型约束则确保了类型安全。在未来的开发中,我将继续探索更多TypeScript的高级特性,以提升自己的开发能力。