TypeScript 语言 参数装饰器的类型检查与参数验证

TypeScript阿木 发布于 2025-05-28 7 次阅读


TypeScript 参数装饰器的类型检查与参数验证

在TypeScript中,参数装饰器是一种强大的特性,它允许我们在函数参数上添加额外的元数据或逻辑。参数装饰器可以用于类型检查、参数验证、日志记录、性能监控等多种用途。本文将围绕TypeScript语言中的参数装饰器,重点探讨其类型检查与参数验证的应用。

参数装饰器简介

参数装饰器是TypeScript中的一种特殊装饰器,它应用于函数参数上。参数装饰器可以接收三个参数:装饰目标、装饰目标的属性名称、以及装饰器的位置。参数装饰器可以返回一个值,这个值将被用作参数的默认值。

typescript
function paramDecorator(target: any, propertyKey: string, parameterIndex: number): void {
// 装饰器逻辑
}

类型检查

类型检查是参数装饰器最常用的功能之一。通过参数装饰器,我们可以确保传入的参数符合预期的类型。

使用类型守卫

在TypeScript中,类型守卫是一种检查表达式是否为特定类型的机制。我们可以使用类型守卫在参数装饰器中实现类型检查。

typescript
function isString(value: any): value is string {
return typeof value === 'string';
}

function validateString(target: any, propertyKey: string, parameterIndex: number): void {
const value = target[propertyKey].apply(target, [undefined]);
if (!isString(value)) {
throw new Error(`Expected a string, but got ${typeof value}`);
}
}

class MyClass {
@validateString
public greet(name: string): string {
return `Hello, ${name}`;
}
}

在上面的例子中,`validateString`装饰器使用`isString`类型守卫来检查`greet`方法的参数是否为字符串类型。

使用类型断言

除了类型守卫,我们还可以使用类型断言在参数装饰器中进行类型检查。

typescript
function validateNumber(target: any, propertyKey: string, parameterIndex: number): void {
const value = target[propertyKey].apply(target, [undefined]);
if (typeof value !== 'number') {
throw new Error(`Expected a number, but got ${typeof value}`);
}
}

class MyClass {
@validateNumber
public add(a: number, b: number): number {
return a + b;
}
}

在这个例子中,`validateNumber`装饰器使用类型断言来检查`add`方法的参数是否为数字类型。

参数验证

参数验证是参数装饰器的另一个重要应用。通过参数装饰器,我们可以对传入的参数进行复杂的逻辑验证。

使用正则表达式

我们可以使用正则表达式在参数装饰器中实现复杂的字符串验证。

typescript
function validateEmail(target: any, propertyKey: string, parameterIndex: number): void {
const value = target[propertyKey].apply(target, [undefined]);
const emailRegex = /^[^s@]+@[^s@]+.[^s@]+$/;
if (!emailRegex.test(value)) {
throw new Error(`Invalid email address: ${value}`);
}
}

class MyClass {
@validateEmail
public sendEmail(to: string): void {
console.log(`Sending email to ${to}`);
}
}

在上面的例子中,`validateEmail`装饰器使用正则表达式来验证`sendEmail`方法的参数是否为有效的电子邮件地址。

使用自定义验证函数

除了正则表达式,我们还可以使用自定义验证函数来实现复杂的参数验证。

typescript
function validateAge(target: any, propertyKey: string, parameterIndex: number): void {
const value = target[propertyKey].apply(target, [undefined]);
if (value 120) {
throw new Error(`Invalid age: ${value}. Age must be between 0 and 120.`);
}
}

class MyClass {
@validateAge
public checkAge(age: number): void {
console.log(`You are ${age} years old.`);
}
}

在这个例子中,`validateAge`装饰器使用自定义验证函数来检查`checkAge`方法的参数是否在合理的年龄范围内。

总结

参数装饰器是TypeScript中一种强大的特性,它可以用于类型检查和参数验证。通过使用参数装饰器,我们可以提高代码的可维护性和健壮性。本文介绍了参数装饰器的类型检查和参数验证的应用,并提供了相应的代码示例。希望这些内容能够帮助您更好地理解和应用TypeScript参数装饰器。