接口是编程中一个强大的工具,它允许定义一个类型必须具备的行为,而不需要实现这些行为的具体细节。在本文中,将展示如何使用接口来设置类型,以确保它们具备某些特定的行为。为了说明这一点,将创建一个简单的接口来控制字符串的验证。
需求说明:
验证的需求非常简单直接。需要确定一个字符串是否满足以下条件:
有了这些简单的需求,就可以开始编写代码了。
在开始编写代码之前,想先解释一下为什么会写下这些需求。作为一名专业的开发者,喜欢明确知道自己在编写什么。发现,将需求写下来是开始解决问题的一个很好的起点。
回到代码本身。需求之一是希望有一个名为IsValid的方法,验证代码将使用这个方法。这就是接口的用武之地;接口本身没有实现能力,所以不能在接口中编写任何实际的逻辑,但可以声明想要使用的方法。以下是接口的代码:
interface Validate {
IsValid(): boolean;
}
现在,需要对接口做一些事情。为了满足需求,将创建一个类来验证字符串是否达到了最小长度,另一个类来确定字符串是否达到了最大长度。这两个类都将使用接口;为此,需要使用implements关键字来声明类实现了接口。
class MinimumLengthValidation implements Validate {
constructor(private text: string, private minimumLength: number) {}
IsValid(): boolean {
return this.text.length >= this.minimumLength;
}
}
class MaximumLengthValidation implements Validate {
constructor(private text: string, private maximumLength: number) {}
IsValid(): boolean {
return this.text.length <= this.maximumLength;
}
}
可能已经注意到构造函数看起来有些不寻常。在构造函数的签名中声明了text和minimumLength。通过将它们标记为private,告诉TypeScript希望在这里分配它们。实际上,这段代码与以下代码完全相同:
class MinimumLengthValidation implements Validate {
private text: string;
private minimumLength: number;
constructor(text: string, minimumLength: number) {
this.text = text;
this.minimumLength = minimumLength;
}
IsValid(): boolean {
return this.text.length >= this.minimumLength;
}
}
最大长度验证的代码看起来与此非常相似,这并不令人惊讶。
编写了验证类之后,准备测试它们。可以这样编写代码:
console.log(new MinimumLengthValidation('ABC12345', 10).IsValid());
// 应该打印 false
console.log(new MinimumLengthValidation('ABC12345AB12345', 10).IsValid());
// 应该打印 true
console.log(new MaximumLengthValidation('ABC12345', 10).IsValid());
// 应该打印 true
console.log(new MaximumLengthValidation('ABC12345AB12345', 10).IsValid());
// 应该打印 false
但这并没有真正展示验证,所以让看看如何使用Validate接口。将创建一个Validate项目的数组。
const validation: Validate[] = [];
validation.push(new MinimumLengthValidation('ABC12345', 10));
validation.push(new MinimumLengthValidation('ABC12345AB12345', 10));
validation.push(new MaximumLengthValidation('ABC12345', 10));
validation.push(new MaximumLengthValidation('ABC12345AB12345', 10));
有了这个,将使用一个循环遍历数组,并打印出验证是否成功。
for (let index = 0; index < validation.length; index++) {
console.log(validation[index].IsValid());
}
已经完成了使用接口来描述一个类可以有哪些行为的过程。开始进入继承的领域,这是面向对象编程的支柱之一。在下一篇文章中,将进一步探讨继承的世界,届时将真正加快步伐。