65.9K
CodeProject 正在变化。 阅读更多。
Home

TypeScript 100 天 (第 5 天)

starIconstarIconstarIconstarIconstarIcon

5.00/5 (4投票s)

2021 年 11 月 1 日

CPOL

3分钟阅读

viewsIcon

5349

如何使用接口设置类型,使其具有特定行为

在 TypeScript 学习之旅的第 4 天,我们了解了如何使用接口作为数据类型。正如我即将向你展示的那样,这并不是接口的全部功能。在这篇文章中,我将演示如何使用接口来设置类型,以便它们必须具有某些行为。就本文而言,我将创建一个简单的接口来控制验证。

要求

验证的需求将非常简单。

  1. 验证将确定一个 string 是否大于或等于最小字符数。
  2. 验证将确定一个 string 是否小于或等于最大字符数。
  3. 验证将使用一个名为 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;
    }
}

你可能会注意到构造函数看起来不寻常。我已经在构造函数的签名中声明了 textminimumLength。通过将它们标记为 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 日:初始版本
© . All rights reserved.