Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions src/ageClassification.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { describe, it, expect } from 'vitest';
import { classifyAge } from './ageClassification';

describe('年齡分類函式測試', () => {
it('應將 12 歲以下分類為 Child', () => {
expect(classifyAge(10)).toBe('Child');
});

it('應將 13 至 17 歲分類為 Teenager', () => {
expect(classifyAge(15)).toBe('Teenager');
});

it('應將 18 至 64 歲分類為 Adult', () => {
expect(classifyAge(30)).toBe('Adult');
});

it('應將 65 歲以上分類為 Senior', () => {
expect(classifyAge(70)).toBe('Senior');
});
});
26 changes: 26 additions & 0 deletions src/ageClassification.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
/**
* 任務:實作一個函式 `classifyAge`,根據年齡進行分類。
*
* 範例:
* classifyAge(10) 應該回傳 "Child"
* classifyAge(15) 應該回傳 "Teenager"
* classifyAge(30) 應該回傳 "Adult"
* classifyAge(70) 應該回傳 "Senior"
*
* @param age - 一個需要被分類的年齡
* @returns - 回傳年齡的分類結果
*/
export function classifyAge(age: number): string {
// 請在此處寫下你的程式碼
if (age < 0) {
throw new Error('Age cannot be negative');
} else if (age <= 10) {
return 'Child';
} else if (age <= 15) {
return 'Teenager';
} else if (age <= 30) {
return 'Adult';
} else {
return 'Senior';
}
}
8 changes: 8 additions & 0 deletions src/arrayFiltering.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { describe, it, expect } from 'vitest';
import { filterEvens } from './arrayFiltering';

describe('陣列過濾函式測試', () => {
it('應該過濾出偶數', () => {
expect(filterEvens([1, 2, 3, 4, 5])).toEqual([2, 4]);
});
});
13 changes: 13 additions & 0 deletions src/arrayFiltering.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
/**
* 任務:實作一個函式 `filterEvens`,過濾出數字陣列中的偶數。
*
* 範例:
* filterEvens([1, 2, 3, 4]) 應該回傳 [2, 4]
* filterEvens([5, 6, 7, 8]) 應該回傳 [6, 8]
*
* @param numbers - 一個需要被過濾的數字陣列
* @returns - 回傳只包含偶數的數字陣列
*/
export function filterEvens(numbers: number[]): number[] {
return numbers.filter((number) => number % 2 === 0);
}
11 changes: 6 additions & 5 deletions src/arraySum.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
/**
* 計算數字陣列的總和
* @param numbers - 要計算總和的數字陣列
*
*
* 範例:
* 輸入: [1, 2, 3, 4, 5]
* 輸出: 15
*
*
* 輸入: [-1, -2, -3]
* 輸出: -6
*
*
* 輸入: []
* 輸出: 0
*/
export function arraySum(numbers: number[]): number {
// 在此實現函式
}
// 在此實現函式
return numbers.reduce((sum, number) => sum + number, 0);
}
14 changes: 14 additions & 0 deletions src/asyncSum.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { describe, it, expect } from 'vitest';
import { asyncSum } from './asyncSum';

describe('非同步加總函式', () => {
it('應該能計算陣列中所有數字的總和', async () => {
const result = await asyncSum([1, 2, 3, 4, 5]);
expect(result).toBe(15);
});

it('應該能正確處理空陣列', async () => {
const result = await asyncSum([]);
expect(result).toBe(0);
});
});
20 changes: 20 additions & 0 deletions src/asyncSum.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/**
* 任務:實作一個函式 `asyncSum`,該函式應該能夠計算陣列中所有數字的總和。
* 範例:asyncSum([1, 2, 3, 4, 5]) 應該回傳 15
* @param numbers - 一個數字陣列
* @returns - 回傳一個 Promise,該 Promise resolve 的值應該是陣列中所有數字的總和
*/


export function asyncSum(numbers: number[]): Promise<number> {
return new Promise((resolve, reject) => {
try {
// 請在此處寫下你的程式碼
} catch (error) {
reject(error);
}
});
}


// 備註:題目中即使累加操作本身是同步的,也可以使用 Promise 來模擬非同步的情況。這可以讓學生練習如何使用 Promise 來處理非同步操作
16 changes: 8 additions & 8 deletions src/bookCategoryEnum.ts
Original file line number Diff line number Diff line change
@@ -1,28 +1,28 @@
/**
* 這個 Enum 的目的是定義書籍的類別。
* 在 TypeScript 中,我們可以使用 Enum 來定義一組具名的常數,這裡我們定義了 Novel、Poetry 和 Biography 三種類別。
*
*
* 範例:
* BookCategory.Novel 代表小說類別
* BookCategory.Poetry 代表詩歌類別
* BookCategory.Biography 代表傳記類別
*/
export enum BookCategory {
Novel = 'Novel',
Science = 'Science',
Education = 'Education'
Novel = 'Novel',
Science = 'Science',
Education = 'Education',
}

/**
* 這個函式的目的是根據輸入的書籍類別返回對應的描述。
* 你需要使用 TypeScript 的 Enum 來定義書籍的類別,並在函式中返回對應的描述。
* Enum 應該包含 Novel、Poetry 和 Biography 三種類別,並分別對應到 '小說'、'詩歌' 和 '傳記' 三個字串。
*
*
* 範例:
* 輸入: BookCategory.Novel
* 輸出: 'Book category: Novel'
*/

export function getBookCategory(category) {
// 在此實現函式
}
export function getBookCategory(category: BookCategory): string {
return `Book category: ${category}`;
}
8 changes: 4 additions & 4 deletions src/booleanChecker.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
/**
* 判斷輸入的數字是否為正數
* @param number - 要判斷的數字
*
*
* 注意:這個函式目前有錯誤,需要修正。正確的實現應該是判斷輸入的數字是否大於 0。
*/
export function isPositive(number: number): boolean {
// 故意寫錯的程式碼
return number < 0;
}
// 故意寫錯的程式碼
return number > 0;
}
21 changes: 13 additions & 8 deletions src/calculator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@
* @param b - 第二個數字
*/
export function add(a: number, b: number): number {
// 在此實現函式
// 在此實現函式
return a + b;
}

/**
Expand All @@ -13,7 +14,9 @@ export function add(a: number, b: number): number {
* @param b - 第二個數字
*/
export function subtract(a: number, b: number): number {
// 在此實現函式
// 在此實現函式

return a - b;
}

/**
Expand All @@ -22,7 +25,8 @@ export function subtract(a: number, b: number): number {
* @param b - 第二個數字
*/
export function multiply(a: number, b: number): number {
// 在此實現函式
// 在此實現函式
return a * b;
}

/**
Expand All @@ -31,17 +35,18 @@ export function multiply(a: number, b: number): number {
* @param b - 第二個數字
*/
export function divide(a: number, b: number): number {
// 在此實現函式
if (b === 0) throw new Error('Cannot divide by zero');
return a / b;
}

/**
* 實現加法函數,結果不能超過 100。
*
*
* @param a 第一個加數。
* @param b 第二個加數。
* @returns 兩個數字的和,但不超過 100。
*/
export function add100(a: number, b: number): number {
const sum = a + b;
return sum > 100 ? 100 : sum;
}
const sum = a + b;
return sum > 100 ? 100 : sum;
}
16 changes: 16 additions & 0 deletions src/dataProcessingModule.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { describe, it, expect } from 'vitest';
import { sortArray, filterArray, transformArray } from './dataProcessingModule';

describe('資料處理模組', () => {
it('應該正確排序陣列', () => {
expect(sortArray([3, 1, 4])).toEqual([1, 3, 4]);
});

it('應該過濾陣列', () => {
expect(filterArray([1, 2, 3, 4], num => num % 2 === 0)).toEqual([2, 4]);
});

it('應該轉換陣列', () => {
expect(transformArray([1, 2, 3], num => num * 2)).toEqual([2, 4, 6]);
});
});
49 changes: 49 additions & 0 deletions src/dataProcessingModule.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
/**
* 任務:實作一個函式 `sortArray`,將數字陣列由小到大排序。
*
* 範例:
* sortArray([3, 1, 4]) 應該回傳 [1, 3, 4]
*
* @param numbers - 一個數字陣列
* @returns - 回傳一個數字陣列,表示排序後的結果
*/
export function sortArray(numbers: number[]): number[] {
// 請在此處寫下你的程式碼
return numbers.sort((a, b) => a - b);
}

/**
* 任務:實作一個函式 `filterArray`,過濾數字陣列中符合條件的元素。
*
* 範例:
* filterArray([1, 2, 3, 4], num => num % 2 === 0) 應該回傳 [2, 4]
*
* @param numbers - 一個數字陣列
* @param predicate - 一個函式,用來判斷元素是否符合條件
* @returns - 回傳一個數字陣列,表示過濾後的結果
*/
export function filterArray(
numbers: number[],
predicate: (num: number) => boolean
): number[] {
// 請在此處寫下你的程式碼
return numbers.filter(predicate);
}

/**
* 任務:實作一個函式 `transformArray`,將數字陣列中的每個元素進行轉換。
*
* 範例:
* transformArray([1, 2, 3], num => num * 2) 應該回傳 [2, 4, 6]
*
* @param numbers - 一個數字陣列
* @param transform - 一個函式,用來轉換元素
* @returns - 回傳一個數字陣列,表示轉換後的結果
*/
export function transformArray(
numbers: number[],
transform: (num: number) => number
): number[] {
// 請在此處寫下你的程式碼
return numbers.map(transform);
}
18 changes: 18 additions & 0 deletions src/dataStore.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { describe, it, expect } from 'vitest';
import { createDataStore } from './dataStore';

describe('DataStore 函式', () => {
it('應該允許添加和檢索項目', () => {
const store = createDataStore<number>();
store.add(1);
store.add(2);
expect(store.getAll()).toEqual([1, 2]);
});

it('應該能處理不同的類型', () => {
const stringStore = createDataStore<string>();
stringStore.add('hello');
stringStore.add('world');
expect(stringStore.getAll()).toEqual(['hello', 'world']);
});
});
34 changes: 34 additions & 0 deletions src/dataStore.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
/**
* 任務:實作一個函式 `createDataStore`,該函式會建立一個資料儲存庫,該儲存庫有兩個方法:add 和 getAll。
* add 方法用於添加新的項目到儲存庫,getAll 方法用於獲取儲存庫中的所有資料。
*
* 範例:
* const store = createDataStore<number>();
* store.add(1);
* store.add(2);
* store.getAll() 應該回傳 [1, 2]
*
* @returns - 回傳一個物件,該物件有 add 和 getAll 兩個方法
*/
export function createDataStore<T>() {
// 宣告一個名為 data 的變數,其為 T 型別的陣列,並初始化為空陣列
// T 是一個泛型參數,代表任何型別
// let data
const data: T[] = [];

// 定義一個名為 add 的函式,該函式接收一個 T 型別的參數 item,並將 item 添加到 data 陣列中
// 這裡的 T 也是泛型,所以 item 可以是任何型別
// function add(){}
function add(item: T) {
data.push(item);
}

// 定義一個名為 getAll 的函式,該函式回傳 data 陣列的所有元素
// 回傳的陣列中的元素型別也是 T,所以可以是任何型別
//function getAll()
function getAll(): T[] {
return [...data];
}

return { add, getAll };
}
12 changes: 12 additions & 0 deletions src/fetchData.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { describe, it, expect } from 'vitest';
import { fetchData } from './fetchData';

describe('非同步取得資料', () => {
it('應該能從提供的 URL 取得資料', async () => {
const data = await fetchData(
'https://jsonplaceholder.typicode.com/todos/1'
);

expect(data).toHaveProperty('id');
});
});
14 changes: 14 additions & 0 deletions src/fetchData.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
/**
* 任務:實作一個 async 函式 `fetchData`,該函式應該能夠從指定的 URL 取得資料。
* 範例:fetchData('https://jsonplaceholder.typicode.com/todos/1') 應該回傳一個包含 id、title 等屬性的物件
* @param url - 要取得資料的 URL
* @returns - 回傳一個 Promise,該 Promise resolve 的值應該是從 URL 取得的資料
*/

export async function fetchData(url: string): Promise<any> {
const response = await fetch(url);
const data = await response.json();

return data;
}
// 請在下方寫下你的程式碼
Loading