TypeScript命名空间

栏目: typescript 发布时间:2024-11-01

在TypeScript中,命名空间(Namespaces)是一种封装相关代码的方式,它可以帮助你组织代码,避免命名冲突,并清晰地表达代码之间的逻辑关系。命名空间通过namespace关键字来定义,并且可以在其中定义变量、函数、类、接口等。

1. 定义命名空间

你可以使用namespace关键字来定义一个命名空间。命名空间内部可以包含其他命名空间、变量、函数、类等。

namespace Validation {
    export interface StringValidator {
        isAcceptable(s: string): boolean;
    }

    export class LettersOnlyValidator implements StringValidator {
        isAcceptable(s: string): boolean {
            return /^[A-Za-z]+$/.test(s);
        }
    }

    export class ZipCodeValidator implements StringValidator {
        isAcceptable(s: string): boolean {
            return /^\d{5}(-\d{4})?$/.test(s);
        }
    }
}

在这个例子中,我们定义了一个名为Validation的命名空间,它包含了一个接口StringValidator和两个实现了该接口的类LettersOnlyValidatorZipCodeValidator

2. 使用命名空间

要使用命名空间中的成员,你需要通过命名空间名来访问它们。

let strings = ["Hello", "98765", "Goodbye"];

let validators: { [s: string]: Validation.StringValidator; } = {};
validators["ZIP code"] = new Validation.ZipCodeValidator();
validators["Letters only"] = new Validation.LettersOnlyValidator();

// Some samples and testing
for (let s of strings) {
    let validator = validators[s.replace(/\s+/g, "").toUpperCase()];
    if (validator && validator.isAcceptable(s)) {
        console.log(`${s} is valid.`);
    } else {
        console.log(`${s} is not valid.`);
    }
}

在这个例子中,我们创建了一个对象validators,它的键是字符串,值是Validation命名空间中的StringValidator类型的实例。然后,我们遍历了一个字符串数组,并使用相应的验证器来检查每个字符串是否有效。

3. 嵌套命名空间

命名空间可以嵌套在其他命名空间中,这有助于进一步组织代码。

namespace Geometry {
    export namespace Shapes {
        export class Circle {
            constructor(public radius: number) {}

            getArea(): number {
                return Math.PI * this.radius ** 2;
            }
        }

        export class Square {
            constructor(public side: number) {}

            getArea(): number {
                return this.side ** 2;
            }
        }
    }
}

let c = new Geometry.Shapes.Circle(10);
console.log(c.getArea()); // 输出: 314.1592653589793

let s = new Geometry.Shapes.Square(5);
console.log(s.getArea()); // 输出: 25

在这个例子中,我们定义了一个名为Geometry的命名空间,它包含了一个嵌套的命名空间ShapesShapes中定义了两个类CircleSquare

4. 别名与合并命名空间

你可以为命名空间创建别名,这有助于简化长命名空间的引用。此外,你还可以合并命名空间,将多个命名空间合并为一个。

namespace MyNamespace {
    export interface Shape {
        color: string;
    }
}

namespace MyNamespace {
    export interface Shape {
        sides: number; // 与上面的Shape接口合并
    }
}

// 使用别名
type MyShape = MyNamespace.Shape;

let shape: MyShape = { color: "red", sides: 4 };
console.log(shape);

在这个例子中,我们定义了一个名为MyNamespace的命名空间,并在其中定义了一个Shape接口。然后,我们再次定义了MyNamespace,并在其中添加了一个新的属性到Shape接口中。由于这两个定义在同一个命名空间中,所以它们会被合并。最后,我们使用了一个别名MyShape来引用MyNamespace.Shape

命名空间是一种组织代码的好方法,它可以帮助你避免命名冲突,并使代码更加清晰和易于维护。通过定义和使用命名空间,你可以更好地组织你的typescript项目。

本文地址:https://www.tides.cn/p_typescript-namespace