TypeScript 100 天 (第 5 天)





5.00/5 (4投票s)
如何使用接口设置类型,使其具有特定行为
在 TypeScript 学习之旅的第 4 天,我们了解了如何使用接口作为数据类型。正如我即将向你展示的那样,这并不是接口的全部功能。在这篇文章中,我将演示如何使用接口来设置类型,以便它们必须具有某些行为。就本文而言,我将创建一个简单的接口来控制验证。
要求
验证的需求将非常简单。
- 验证将确定一个
string
是否大于或等于最小字符数。 - 验证将确定一个
string
是否小于或等于最大字符数。 - 验证将使用一个名为
IsValid
的方法来确定string
是否有效。
有了这些简单的需求,我就可以开始编写代码了。
在开始编写代码之前,我想解决你可能想知道的一件事,即我为什么要把需求写下来?答案很简单:作为一名专业的开发人员,我喜欢知道我正在编写什么。我发现写下需求的行为是一个很好的起点,可以让我开始解决我正在编写代码的问题。
实现
好的,回到代码。我的需求之一是我想要一个名为 IsValid
的方法,我的验证代码将使用它。这就是 interface
的用武之地;接口没有任何实现功能,所以我无法在我的接口中编写任何实际逻辑,但我可以声明我想使用哪些方法。这是接口的代码。
interface Validate {
IsValid(): boolean;
}
所以,现在我需要对接口做一些事情。为了满足我的需求,我将创建一个类来验证 string
是否为最小长度,并创建另一个类来确定该类是否为最大长度。这两个类都将使用该接口;为此,我需要使用 implements
来说明该类实现了该接口。
class MinimumLengthValidation implements Validate {
constructor(private text: string, private minimumLength: number) {}
IsValid(): boolean {
return this.text.length >= this.minimumLength;
}
}
你可能会注意到构造函数看起来不寻常。我已经在构造函数的签名中声明了 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;
}
}
毫不奇怪,最大长度验证看起来与此代码非常相似。
class MaximumLengthValidation implements Validate {
constructor(private text: string, private maximumLength: number) {}
IsValid(): boolean {
return this.text.length <= this.maximumLength;
}
}
测试代码
编写了验证类后,我就可以测试它们了。我可以像这样编写代码。
console.log(new MinimumLengthValidation('ABC12345', 10).IsValid()); // Should print false
console.log(new MinimumLengthValidation('ABC12345AB12345', 10).IsValid()); // Should print true
console.log(new MaximumLengthValidation('ABC12345', 10).IsValid()); // Should print true
console.log(new MaximumLengthValidation('ABC12345AB12345', 10).IsValid()); // Should print false
这并没有真正演示我的验证,所以让我们看看如何使用 Validate
接口。我将创建一个 Validate
项目的数组。
const validation: Validate[] = [];
我现在要做的是将上面小代码片段中的相同验证项目 push
到数组中。
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());
}
代码
我们已经到了使用接口来描述类可以具有的行为的结尾。我们开始进入继承的领域,继承是面向对象的支柱之一。在下一篇文章中,我将进一步深入继承的世界,我们将真正加快步伐。
非常感谢你的阅读。与往常一样,本文背后的代码可在 Github 上获得。
历史
- 2021 年 11 月 1 日:初始版本