iT邦幫忙

2024 iThome 鐵人賽

DAY 14
0
JavaScript

我推的TypeScript 操作大全系列 第 14

我推Day14 - 偷師大法學到的 TypeScript 實戰祕技技巧

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20240928/20124462Dv6QWjDw00.jpg


嘿嘿~今天想跟大家分享的是一位資深工程師的 TypeScript 實戰技巧!
這些技巧可不是隨便在網路上隨便找就能看到的喔~

大家準備好一起來偷師了嗎?
其實我最近有機會跟一位資深軟體工程師一起工作,在這過程中,我注意到他在寫 TypeScript 時的一些特別技巧,讓我大開眼界。
這篇文章會分享 5 個他常用的技巧,希望對你們在寫程式碼時有所幫助,讓你的程式碼也能高人一等喔!


1. 熟練運用高階函式

首先讓我印象最深刻的是他頻繁使用的高階函式(Higher Order Functions),像是 mapreducefiltersomeevery 等等。這些函式不僅能讓程式碼更精簡、可讀性更高,也能大幅提升程式碼的重複利用率和抽象程度。

來看看其中幾個範例:

// 使用 reduce 計算平均分數
const calculateAverageScore = (results: ExamResult[]): number =>
  results.reduce((acc, result) => acc + result.score, 0) / results.length;

// 使用 some 和 every 過濾學生
const passedStudents = students.filter(student =>
  student.results.some(result => passingGrade(result.grade))
);
const failedStudents = students.filter(student =>
  student.results.every(result => !passingGrade(result.grade))
);

// 使用 map 和 flatMap 解析細節
const allGrades = [...new Set(results.map((result) => result.grade))].join(', ');
const allSubjects = [...new Set(results.map((result) => result.subject))].join(', ');
const comments = results.flatMap((result) => result.comments || []);

2. 實作應用 Generator 函式

有注意到 function* studentDetailsGenerator() 嗎?
這就是所謂的 Generator 函式,利用 yield 可以在需要時逐個生成值,保留狀態,方便處理大量資料或是實現懶惰評估。

// 使用 Generator 函式逐個處理學生資料
function* studentDetailsGenerator(students: Student[]): Generator<Student> {
  for (const student of students) {
    yield student;
  }
}

const allDetails: ProcessedStudentDetails[] = [];
for (const student of studentDetailsGenerator(students)) {
  allDetails.push(processStudentDetail(student));
}
  • 懶惰評估(Lazy Evaluation)是一種程式設計技巧,指的是程式碼中的運算或資料的生成,只有在真正需要時才會執行,而不是立刻進行。

  • 這樣的機制可以提升效能,因為它避免了不必要的計算或資料處理,特別是在處理大量資料時非常有用。

  • 舉個簡單例子來說:

假設我們有一個資料集裡面有數百萬筆數據,但我們其實只需要前幾筆資料來進行某些操作。
傳統的方式可能會一次性地把所有數據處理完,再過濾到你想要的結果,這樣會耗費大量資源。

而 Generator 函式透過 yield 的方式,只會在我們實際去取資料的時候,才生成一筆結果。
這就是所謂的懶惰評估:資料不會一次性全部生成,而是按需分批生成,這樣可以大大減少記憶體和處理資源的使用。

具體程式碼示例:

function* generateNumbers() {
  console.log('開始生成數字');
  yield 1;
  console.log('生成了數字 1');
  yield 2;
  console.log('生成了數字 2');
  yield 3;
  console.log('生成了數字 3');
}

const generator = generateNumbers(); // 此時並沒有開始執行裡面的程式碼

console.log(generator.next().value); // 開始生成數字,然後輸出 1
console.log(generator.next().value); // 輸出 2
console.log(generator.next().value); // 輸出 3

在這個範例中,generateNumbers 這個 Generator 函式並不會一次性執行完所有 yield。而是每當你呼叫 .next() 時,它才會往下跑到下一個 yield,並返回對應的值,這就是懶惰評估。
資料生成是隨取隨用的,這樣即使有大量數據,我們也不會一次性全部處理,節省資源。

3. 展開運算子與物件解構

展開運算子 ... 和物件解構是現代 JavaScript 的技術,讓我們能以簡潔的方式操作物件與陣列,讓程式碼更乾淨易讀。

// 使用 Set 搭配展開運算子創建唯一的成績和科目列表
const allGrades = [...new Set(results.map((result) => result.grade))].join(', ');
const allSubjects = [...new Set(results.map((result) => result.subject))].join(', ');

// 使用物件解構快速取得學生屬性
const { name, age, results } = student;

4. 高級型別定義

TypeScript 是一個強型別的語言,定義與操作型別是它的核心。像是使用 Pick 工具型別可以從既有的型別中選擇特定屬性來定義新型別,這些技術讓程式碼更加穩健、維護性更高。

// 型別定義
type ProcessedStudentDetails = Pick<Student, 'name' | 'age'> & {
  averageScore: number;
  allGrades: string;
  allSubjects: string;
  comments: string[];
};

5. 使用 Currying 技術

Currying 是一種將多參數函式轉換為一系列單參數函式的技巧,可以大大提升函式的重複使用性和可讀性。以下範例展示如何使用 Currying 來創建評分檢查函式:

// Currying 函式來生成基礎檢查函式
const createGradeChecker = (failingGrade: string) => (grade: string) => grade !== failingGrade;
const passingGrade = createGradeChecker('F');

本文核心重點

  1. 高階函式的應用:透過 mapreducefilter 等高階函式,可以簡化資料處理的邏輯,減少重複的程式碼,並提升可讀性和抽象層次。

  2. 這些函式讓你可以以更精簡的方式處理陣列和資料集合,提升程式碼的可維護性。

  3. Generator 函式的實際應用:Generator 函式透過 yield 關鍵字,可以逐步生成資料,這在需要處理大量資料時非常有效。這個技巧的核心在於它可以保留函式的狀態,避免一次性處理大量資料,從而提升程式的效能。

  4. 展開運算子與物件解構:這些現代語法讓你能更有效率地處理物件和陣列。展開運算子 ... 和物件解構可以簡潔地提取或組合資料,使程式碼更直觀,減少了繁瑣的循環操作。

  5. 高級型別定義:TypeScript 的強型別系統讓程式碼更穩健,透過使用像 Pick 這樣的工具型別,可以重新定義結構,避免重複定義,提高程式碼的安全性與維護性。

  6. Currying 技術的應用:Currying 將多參數函式轉換成一系列單參數函式,提高了函式的靈活性和重用性。這種技巧有助於在不同上下文中重複使用相似的函式邏輯,增加程式碼的可讀性。


結語

這些實用又厲害的技巧,就是讓你 TypeScript 程式碼更上一層樓的秘密武器!
別害怕嘗試新方法,每一次的挑戰都是讓自己變強大的機會~用這些小撇步,讓你的程式碼也能充滿創意和靈魂!

相信自己的潛力,不斷學習、持續精進,讓每一行程式碼都閃閃發亮吧!💫

Coding is fun, keep exploring, keep coding, and remember:加油,相信自己!你的程式碼會改變世界的!💻❤️🚀


上一篇
我推Day13 - TypeScript 除錯教學:輕鬆搞定型別問題!
下一篇
我推Day15 - 技術大神專屬!TypeScript JSON 處理術你一定要學!
系列文
我推的TypeScript 操作大全15
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言