如何在 TypeScript 中使用接口和类?


在 TypeScript 中,类是定义变量和方法的模板。我们可以使用类模板创建对象,这意味着类是面向对象编程中的可重用组件,我们可以通过创建其对象来重用它。

我们可以使用“interface”关键字在 TypeScript 中定义接口。接口包含类结构。接口类似于我们在其他编程语言(如 Java 和 C++)中定义的抽象类。它仅包含变量及其类型以及方法及其返回类型和参数类型的声明。类定义接口的方法并初始化在接口中声明的变量的值。

在 TypeScript 中使用类实现接口

在本节中,我们将学习如何创建和使用类实现接口。我们可以使用“implements”关键字将任何接口实现到类中。

语法

在下面的语法中,我们创建了接口和类。此外,我们还展示了将接口实现到类的语法。

interface Wall {
   // variable and method declaration
   color: string;
   get_size: () => number;
}

class WallDetails implements Wall {
   // defining the variables and methods
   color = "#434322";
   get_size() {
      return 20;
   }
}

步骤

  • 步骤 1 - 首先,创建 Wall 接口,其中包含 wall_id 和 color 变量声明。

  • 步骤 2 - 声明 get_size() 方法,该方法将 wall_id 作为参数并返回数字。

  • 步骤 3 - 声明 get_wall_message() 方法,该方法不带任何参数,但返回字符串。

  • 步骤 4 - 定义名为 walllDetails 的类,并使用 implements 关键字将 Wall 接口实现到 wallDetails 类。在 wallDetails 类中,使用构造函数初始化 wall_id 和 color 变量。

  • 步骤 5 - 接下来,定义 get_size() 方法,该方法根据其作为参数获取的 wall_id 值返回墙的大小。此外,实现 get_wall_size() 方法,该方法始终返回相同的字符串消息。

示例 1

以下示例演示了创建 wall 接口并将其实现到 wallDetails 类中。

此外,我们创建了 wallDetails 类的 wall1 对象,其 wall_id 为 1。当我们以 wall1 对象为参考调用 get_size() 和 get_wall_message() 方法时,用户可以观察输出。

// defining the wall interface
interface Wall {
   // variable and method declaration
   wall_id: number;
   get_size: (wall_id: number) => number;
   get_wall_message: () => string;
}

class WallDetails implements Wall {
   // defining the variables and methods
   wall_id: number;
   // constructor to initialize the variables
   constructor(wall_id: number) {
      this.wall_id = wall_id;
   }
  
   get_size(wall_id: number): number {
      if (wall_id < 10) {
         return 10;
      } else if (wall_id > 10 && wall_id < 50) {
         return 50;
      }
      return 100;
   }

   get_wall_message(): string {
      return "Don't draw pictures on the wall!";
   }
}

let wall1 = new WallDetails(1);
console.log("The size of the wall1 is " + wall1.get_size(wall1.wall_id));
console.log("The message of the wall1 is " + wall1.get_wall_message());

编译后,它将生成以下 JavaScript 代码 -

var WallDetails = /** @class */ (function () {
   // constructor to initialize the variables
   function WallDetails(wall_id) {
      this.wall_id = wall_id;
   }
   WallDetails.prototype.get_size = function (wall_id) {
      if (wall_id < 10) {
         return 10;
      }
      else if (wall_id > 10 && wall_id < 50) {
         return 50;
      }
      return 100;
   };
   WallDetails.prototype.get_wall_message = function () {
      return "Don't draw pictures on the wall!";
   };
   return WallDetails;
}());
var wall1 = new WallDetails(1);
console.log("The size of the wall1 is " + wall1.get_size(wall1.wall_id));
console.log("The message of the wall1 is " + wall1.get_wall_message());

输出

以上代码将产生以下输出 -

The size of the wall1 is 10
The message of the wall1 is Don't draw pictures on the wall!

示例 2

在下面的示例中,我们定义了 card 接口,其中包含 card_size、gradient 和 card_phone_No 属性。gradient 属性是可选的,以便我们可以在没有 gradient 的情况下创建 card 类型的对象。card_phone_No 是一个只读属性,这意味着我们无法修改该属性。

我们创建了类型为 card 的 card_obj1,其中包含所有 3 个属性及其值。此外,我们创建了类型为 card 的 card_ob2,它不包含 gradient 属性,但它仍然可以成功编译,因为 gradient 是可选的。

// Creating the card interface containing the card_size, gradient, and card_phone_No properties
interface card {
   card_size: number;
   gradient?: string;
   readonly card_phone_No: number;
}

// defining the card_obj1 with all 3 properties
let card_obj1: card = {
   card_size: 20,
   gradient: "black-white",
   card_phone_No: 92323232332,
};

//  defining the card_obj2 object without gradient property as it is an optional
let card_obj2: card = {
   card_size: 10,
   card_phone_No: 446189746464,
};

// card_obj1.card_phone_No = 2398456456657 // this gives an error as card_phone_No is read only, we can't modify it.

console.log(
"Printing the card_obj2 details
" + "Card size: " + card_obj2.card_size + "Phone No : " + card_obj2.card_phone_No + "
gradient: " +card_obj2.gradient );

在输出中,我们可以看到 card_ob2 的 gradient 属性的值为 undefined。

编译后,它将生成以下 JavaScript 代码 -

// defining the card_obj1 with all 3 properties
var card_obj1 = {
   card_size: 20,
   gradient: "black-white",
   card_phone_No: 92323232332
};

//  defining the card_obj2 object without gradient property as it is an optional
var card_obj2 = {
   card_size: 10,
   card_phone_No: 446189746464
};

// card_obj1.card_phone_No = 2398456456657 // this gives an error as card_phone_No is read only, we can't modify it.
console.log("Printing the card_obj2 details" +
   "
Card size: " + card_obj2.card_size + "
Phone No : " + card_obj2.card_phone_No + "gradient: " + card_obj2.gradient);

输出

以上代码将产生以下输出 -

Printing the card_obj2 details
Card size: 10
Phone No : 446189746464
gradient: undefined

示例 3

在下面的示例中,我们定义了接口 func_type,其中包含单个函数的结构。之后,我们定义了 func1() 变量,它将字符串作为第一个参数,将布尔值作为第二个参数,并打印参数值。

之后,我们创建了类型为 function_type 的 func_variable 并将其值赋值为 func1。之后,我们使用 func_variable 调用 func1() 函数。

// defining the interface as a function type
interface function_type {
   // function takes two parameters; string and boolean and returns void
   (param1: string, param2: boolean): void;
}

// func1 prints the parameter values
function func1(param1: string, param2: boolean): void {
   console.log("The value of param1 is " + param1);
   console.log("The value of the param2 is " + param2);
}

// func_variable is of type function_type interface and assigned the func1 function
let func_variable: function_type = func1;

// we can call func1() via func_variable
func_variable("TutorialsPoint", true);

编译后,它将生成以下 JavaScript 代码 -

// func1 prints the parameter values
function func1(param1, param2) {
   console.log("The value of param1 is " + param1);
   console.log("The value of the param2 is " + param2);
}

// func_variable is of type function_type interface and assigned the func1 function
var func_variable = func1;

// we can call func1() via func_variable
func_variable("TutorialsPoint", true);

输出

以上代码将产生以下输出 -

The value of param1 is TutorialsPoint
The value of the param2 is true

在本教程中,我们学习了如何在 TypeScript 中使用接口和类。

更新于: 2023年1月16日

2K+ 浏览量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告