TypeScript 如何在函式中支援可選引數?


TypeScript 是 JavaScript 的一個靜態型別超集,它為該語言添加了靜態型別功能。TypeScript 的關鍵特性之一是它能夠在函式宣告中提供可選引數,允許開發人員定義引數在函式呼叫期間可能提供也可能不提供的函式。這種靈活性增強了程式碼的可重用性並簡化了函式呼叫,從而產生了更易於維護和表達的程式碼。

在本教程中,我們將探討 TypeScript 如何在函式中支援可選引數,涵蓋語法、優點和一些實際示例。

語法

要在 TypeScript 函式中定義可選引數,可以在函式宣告中引數名稱後使用問號 (?) 符號。這表示該引數是可選的,可以在呼叫函式時省略。帶有可選引數的函式的通用語法如下所示:

function functionName(param1: type, param2?: type) {
   // Function body
}

在上面的語法中,param1 是必需引數,而 param2 是可選引數。問號表示 param2 不是強制性的,可以在呼叫函式時省略。可選引數只能放在引數列表的末尾。

可選引數的優點

  • 靈活性 - 可選引數透過允許開發人員在呼叫函式時省略某些引數,從而為函式呼叫提供了靈活性。這在某些情況下可能很有用,在這些情況下引數可能並不總是必要的,從而導致更簡潔和更簡潔的程式碼。

  • 程式碼可重用性 - 可選引數能夠建立可在多種情況下重用的函式。透過使引數可選,開發人員可以定義適應各種用例的通用函式,而無需為每個特定用例定義單獨的函式。

  • 改進的可讀性 - 可選引數可以透過清楚地指示哪些引數是必需的以及哪些引數是可選的來增強程式碼的可讀性。這使開發人員能夠更輕鬆地理解函式的預期用法,並使程式碼更具自解釋性。

示例

示例 1:基本可選引數

在下面的示例中,greet 函式有一個可選引數 greeting。如果在函式呼叫期間提供了問候語,它將包含在輸出中。如果省略了問候語,則將使用預設問候語。

function greet(name: string, greeting?: string) {
   if (greeting) {
      console.log(`${greeting}, ${name}!`);
   } else {
      console.log(`Hello, ${name}!`);
   }
}
greet("Alice");  // Output: Hello, Alice!
greet("Bob", "Hi");  // Output: Hi, Bob!

編譯後,它將生成以下 JavaScript 程式碼:

function greet(name, greeting) {
   if (greeting) {
      console.log("".concat(greeting, ", ").concat(name, "!"));
   }
   else {
      console.log("Hello, ".concat(name, "!"));
   }
}
greet("Alice"); // Output: Hello, Alice!
greet("Bob", "Hi"); // Output: Hi, Bob!

輸出

以上程式碼將產生以下輸出:

Hello, Alice!
Hi, Bob!

示例 2:具有預設值的可選引數

在此示例中,calculateArea 函式有兩個引數,width 和 height。height 引數是可選的,並且具有預設值 10。如果在函式呼叫期間未提供 height,則預設為 10。

function calculateArea(width: number, height: number = 10) {
   return width * height;
}

console.log(`The area with 5 input is: ${calculateArea(5)}`); 
console.log(`The area with 5, 8 input is: ${calculateArea(5, 8)}`);

編譯後,它將生成以下 JavaScript 程式碼:

function calculateArea(width, height) {
   if (height === void 0) { height = 10; }
   return width * height;
}
console.log("The area with 5 input is: ".concat(calculateArea(5)));
console.log("The area with 5, 8 input is: ".concat(calculateArea(5, 8)));

輸出

The area with 5 input is: 50
The area with 5, 8 input is: 40

示例 3:回撥函式中的可選引數

在此示例中,fetchData 函式接受一個回撥函式作為可選引數。fetchData 方法被定義為模擬從給定 URL 獲取資料的過程。回撥函式可以在有或沒有錯誤引數的情況下呼叫,具體取決於資料獲取操作期間是否發生錯誤。

function fetchData(url: string, callback: (data: any, error?: Error) => void) {
   // Simulating data fetching from the URL
   const data = { id: 1, name: "John Doe" };
   // Invoke the callback function with the fetched data
   callback(data);
   // Simulating the presence of an error
   const error = new Error("Oh an error occurred!");
   callback(data, error);
}
// Example usage:
fetchData("https://example.com/data", (data, error) => {
   if (error) {
      console.error("An error occurred:", error);
   } else {
      console.log("Fetched data:", data, "

"); } });

編譯後,它將生成以下 JavaScript 程式碼:

function fetchData(url, callback) {
   // Simulating data fetching from the URL
   var data = { id: 1, name: "John Doe" };
   // Invoke the callback function with the fetched data
   callback(data);
   // Simulating the presence of an error
   var error = new Error("Oh an error occurred!");
   callback(data, error);
}
// Example usage:
fetchData("https://example.com/data", function (data, error) {
   if (error) {
      console.error("An error occurred:", error);
   }
   else {
      console.log("Fetched data:", data, "

"); } });

輸出

Fetched data: { id: 1, name: 'John Doe' } 

An error occurred: Error: Oh an error occurred!
   at fetchData (/home/cg/root/6477262d95bb2/main.js:7:17)
   at Object.<anonymous> (/home/cg/root/6477262d95bb2/main.js:11:1)
   at Module._compile (internal/modules/cjs/loader.js:999:30)
   at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10)
   at Module.load (internal/modules/cjs/loader.js:863:32)
   at Function.Module._load (internal/modules/cjs/loader.js:708:14)
   at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:60:12)
   at internal/main/run_main_module.js:17:47

第二個帶有錯誤引數的呼叫會導致終端出現錯誤,這符合預期。

示例 4:可選物件屬性

在此示例中,Person 介面具有可選屬性,例如 ageemaildisplayPerson 函式可以處理符合 Person 介面的物件,無論可選屬性是否存在。

interface Person {
   name: string;
   age?: number;
   email?: string;
}

function displayPerson(person: Person) {
   console.log(`Name: ${person.name}`);
   if (person.age) {
      console.log(`Age: ${person.age}`);
   }
   if (person.email) {
      console.log(`Email: ${person.email}`);
   }
}

const alice: Person = { name: "Alice" };
const bob: Person = { name: "Bob", age: 25, email: "bob@example.com" };

displayPerson(alice);
displayPerson(bob);

編譯後,它將生成以下 JavaScript 程式碼:

function displayPerson(person) {
   console.log("Name: ".concat(person.name));
   if (person.age) {
      console.log("Age: ".concat(person.age));
   }
   if (person.email) {
      console.log("Email: ".concat(person.email));
   }
}
var alice = { name: "Alice" };
var bob = { name: "Bob", age: 25, email: "bob@example.com" };
displayPerson(alice);
displayPerson(bob);

輸出

Name: Alice
Name: Bob
Age: 25
Email: bob@example.com

示例 5:類方法中的可選引數

在此示例中,我們有一個 Rectangle 類,它具有一個 calculateArea 方法。calculateArea 方法有一個可選引數 unit,它表示面積的度量單位。如果提供了單位,它們將包含在輸出中。如果省略了單位,則預設行為將顯示沒有單位的面積。這允許根據呼叫者的特定需求靈活使用 calculateArea 方法。

class Rectangle {
   private width: number;
   private height: number;

   constructor(width: number, height: number) {
      this.width = width;
      this.height = height;
   }

   calculateArea(units?: string): number {
      const area = this.width * this.height;
      if (units) {
         console.log(`Area: ${area} ${units}`);
      } else {
         console.log(`Area: ${area}`);
      }
      return area;
   }
}

const rectangle1 = new Rectangle(5, 10);
rectangle1.calculateArea();  // Output: Area: 50
rectangle1.calculateArea("sq. units");  // Output: Area: 50 sq. units

編譯後,它將生成以下 JavaScript 程式碼:

var Rectangle = /** @class */ (function () {
   function Rectangle(width, height) {
      this.width = width;
      this.height = height;
   }
   Rectangle.prototype.calculateArea = function (units) {
      var area = this.width * this.height;
      if (units) {
         console.log("Area: ".concat(area, " ").concat(units));
      }
      else {
         console.log("Area: ".concat(area));
      }
      return area;
   };
   return Rectangle;
}());
var rectangle1 = new Rectangle(5, 10);
rectangle1.calculateArea(); // Output: Area: 50
rectangle1.calculateArea("sq. units"); // Output: Area: 50 sq. units

輸出

以上程式碼將產生以下輸出:

Area: 50
Area: 50 sq. units

結論

TypeScript 在函式中對可選引數的支援增強了程式碼的靈活性和可重用性,並提高了可讀性。透過使某些引數可選,開發人員可以建立可以使用或不使用特定引數呼叫的函式。此功能允許更簡潔和更適應的程式碼,從而更容易在不同場景中使用函式。瞭解如何在 TypeScript 中定義和使用可選引數可以極大地改善您的開發體驗,從而產生更易於維護和表達的程式碼。

更新於: 2023-08-21

225 次檢視

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告