From 056e96b76e6c0e516832086cdb27bbae39b9d106 Mon Sep 17 00:00:00 2001 From: gonsakon Date: Mon, 25 Dec 2023 15:05:34 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=9C=AB=2015=20?= =?UTF-8?q?=E9=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ageClassification.test.ts | 20 +++++++++++++++ src/ageClassification.ts | 15 +++++++++++ src/arrayFiltering.test.ts | 8 ++++++ src/arrayFiltering.ts | 13 ++++++++++ src/asyncSum.test.ts | 14 ++++++++++ src/asyncSum.ts | 20 +++++++++++++++ src/dataProcessingModule.test.ts | 16 ++++++++++++ src/dataProcessingModule.ts | 40 +++++++++++++++++++++++++++++ src/dataStore.test.ts | 18 +++++++++++++ src/dataStore.ts | 28 ++++++++++++++++++++ src/fetchData.test.ts | 9 +++++++ src/fetchData.ts | 9 +++++++ src/filterByProperty.test.ts | 17 +++++++++++++ src/filterByProperty.ts | 21 +++++++++++++++ src/objectAccessor.test.js | 12 +++++++++ src/objectAccessor.ts | 17 +++++++++++++ src/personalInfoModule.test.ts | 9 +++++++ src/personalInfoModule.ts | 26 +++++++++++++++++++ src/shoppingCart.test.ts | 22 ++++++++++++++++ src/shoppingCart.ts | 41 ++++++++++++++++++++++++++++++ src/stringProcessing.test.ts | 8 ++++++ src/stringProcessing.ts | 13 ++++++++++ src/uniqueElements.test.ts | 8 ++++++ src/uniqueElements.ts | 9 +++++++ src/urlParsing.test.ts | 14 ++++++++++ src/urlParsing.ts | 23 +++++++++++++++++ src/userInfoExtension.test.ts | 9 +++++++ src/userInfoExtension.ts | 37 +++++++++++++++++++++++++++ src/utilityFunctionsModule.test.ts | 13 ++++++++++ src/utilityFunctionsModule.ts | 25 ++++++++++++++++++ 30 files changed, 534 insertions(+) create mode 100644 src/ageClassification.test.ts create mode 100644 src/ageClassification.ts create mode 100644 src/arrayFiltering.test.ts create mode 100644 src/arrayFiltering.ts create mode 100644 src/asyncSum.test.ts create mode 100644 src/asyncSum.ts create mode 100644 src/dataProcessingModule.test.ts create mode 100644 src/dataProcessingModule.ts create mode 100644 src/dataStore.test.ts create mode 100644 src/dataStore.ts create mode 100644 src/fetchData.test.ts create mode 100644 src/fetchData.ts create mode 100644 src/filterByProperty.test.ts create mode 100644 src/filterByProperty.ts create mode 100644 src/objectAccessor.test.js create mode 100644 src/objectAccessor.ts create mode 100644 src/personalInfoModule.test.ts create mode 100644 src/personalInfoModule.ts create mode 100644 src/shoppingCart.test.ts create mode 100644 src/shoppingCart.ts create mode 100644 src/stringProcessing.test.ts create mode 100644 src/stringProcessing.ts create mode 100644 src/uniqueElements.test.ts create mode 100644 src/uniqueElements.ts create mode 100644 src/urlParsing.test.ts create mode 100644 src/urlParsing.ts create mode 100644 src/userInfoExtension.test.ts create mode 100644 src/userInfoExtension.ts create mode 100644 src/utilityFunctionsModule.test.ts create mode 100644 src/utilityFunctionsModule.ts diff --git a/src/ageClassification.test.ts b/src/ageClassification.test.ts new file mode 100644 index 0000000..07ec85d --- /dev/null +++ b/src/ageClassification.test.ts @@ -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'); + }); +}); \ No newline at end of file diff --git a/src/ageClassification.ts b/src/ageClassification.ts new file mode 100644 index 0000000..136289e --- /dev/null +++ b/src/ageClassification.ts @@ -0,0 +1,15 @@ +/** + * 任務:實作一個函式 `classifyAge`,根據年齡進行分類。 + * + * 範例: + * classifyAge(10) 應該回傳 "Child" + * classifyAge(15) 應該回傳 "Teenager" + * classifyAge(30) 應該回傳 "Adult" + * classifyAge(70) 應該回傳 "Senior" + * + * @param age - 一個需要被分類的年齡 + * @returns - 回傳年齡的分類結果 + */ +export function classifyAge(age: number): string { + // 請在此處寫下你的程式碼 +} \ No newline at end of file diff --git a/src/arrayFiltering.test.ts b/src/arrayFiltering.test.ts new file mode 100644 index 0000000..0e804cd --- /dev/null +++ b/src/arrayFiltering.test.ts @@ -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]); + }); +}); \ No newline at end of file diff --git a/src/arrayFiltering.ts b/src/arrayFiltering.ts new file mode 100644 index 0000000..5c52341 --- /dev/null +++ b/src/arrayFiltering.ts @@ -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[] { + // 請在此處寫下你的程式碼 +} \ No newline at end of file diff --git a/src/asyncSum.test.ts b/src/asyncSum.test.ts new file mode 100644 index 0000000..3cbd1a7 --- /dev/null +++ b/src/asyncSum.test.ts @@ -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); + }); +}); \ No newline at end of file diff --git a/src/asyncSum.ts b/src/asyncSum.ts new file mode 100644 index 0000000..f130e41 --- /dev/null +++ b/src/asyncSum.ts @@ -0,0 +1,20 @@ +/** + * 任務:實作一個函式 `asyncSum`,該函式應該能夠計算陣列中所有數字的總和。 + * 範例:asyncSum([1, 2, 3, 4, 5]) 應該回傳 15 + * @param numbers - 一個數字陣列 + * @returns - 回傳一個 Promise,該 Promise resolve 的值應該是陣列中所有數字的總和 + */ + + +export function asyncSum(numbers: number[]): Promise { + return new Promise((resolve, reject) => { + try { + // 請在此處寫下你的程式碼 + } catch (error) { + reject(error); + } + }); +} + + +// 備註:題目中即使累加操作本身是同步的,也可以使用 Promise 來模擬非同步的情況。這可以讓學生練習如何使用 Promise 來處理非同步操作 \ No newline at end of file diff --git a/src/dataProcessingModule.test.ts b/src/dataProcessingModule.test.ts new file mode 100644 index 0000000..9941b3e --- /dev/null +++ b/src/dataProcessingModule.test.ts @@ -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]); + }); +}); \ No newline at end of file diff --git a/src/dataProcessingModule.ts b/src/dataProcessingModule.ts new file mode 100644 index 0000000..c89415e --- /dev/null +++ b/src/dataProcessingModule.ts @@ -0,0 +1,40 @@ +/** + * 任務:實作一個函式 `sortArray`,將數字陣列由小到大排序。 + * + * 範例: + * sortArray([3, 1, 4]) 應該回傳 [1, 3, 4] + * + * @param numbers - 一個數字陣列 + * @returns - 回傳一個數字陣列,表示排序後的結果 + */ +export function sortArray(numbers: number[]): number[] { + // 請在此處寫下你的程式碼 +} + +/** + * 任務:實作一個函式 `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[] { + // 請在此處寫下你的程式碼 +} + +/** + * 任務:實作一個函式 `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[] { + // 請在此處寫下你的程式碼 +} diff --git a/src/dataStore.test.ts b/src/dataStore.test.ts new file mode 100644 index 0000000..a73dace --- /dev/null +++ b/src/dataStore.test.ts @@ -0,0 +1,18 @@ +import { describe, it, expect } from 'vitest'; +import { createDataStore } from './dataStore'; + +describe('DataStore 函式', () => { + it('應該允許添加和檢索項目', () => { + const store = createDataStore(); + store.add(1); + store.add(2); + expect(store.getAll()).toEqual([1, 2]); + }); + + it('應該能處理不同的類型', () => { + const stringStore = createDataStore(); + stringStore.add('hello'); + stringStore.add('world'); + expect(stringStore.getAll()).toEqual(['hello', 'world']); + }); +}); \ No newline at end of file diff --git a/src/dataStore.ts b/src/dataStore.ts new file mode 100644 index 0000000..0d77eee --- /dev/null +++ b/src/dataStore.ts @@ -0,0 +1,28 @@ +/** + * 任務:實作一個函式 `createDataStore`,該函式會建立一個資料儲存庫,該儲存庫有兩個方法:add 和 getAll。 + * add 方法用於添加新的項目到儲存庫,getAll 方法用於獲取儲存庫中的所有資料。 + * + * 範例: + * const store = createDataStore(); + * store.add(1); + * store.add(2); + * store.getAll() 應該回傳 [1, 2] + * + * @returns - 回傳一個物件,該物件有 add 和 getAll 兩個方法 + */ +export function createDataStore() { + // 宣告一個名為 data 的變數,其為 T 型別的陣列,並初始化為空陣列 + // T 是一個泛型參數,代表任何型別 + // let data + + // 定義一個名為 add 的函式,該函式接收一個 T 型別的參數 item,並將 item 添加到 data 陣列中 + // 這裡的 T 也是泛型,所以 item 可以是任何型別 + // function add(){} + + // 定義一個名為 getAll 的函式,該函式回傳 data 陣列的所有元素 + // 回傳的陣列中的元素型別也是 T,所以可以是任何型別 + //function getAll() + + + return { add, getAll }; +} \ No newline at end of file diff --git a/src/fetchData.test.ts b/src/fetchData.test.ts new file mode 100644 index 0000000..9fc8670 --- /dev/null +++ b/src/fetchData.test.ts @@ -0,0 +1,9 @@ +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'); + }); +}); \ No newline at end of file diff --git a/src/fetchData.ts b/src/fetchData.ts new file mode 100644 index 0000000..6b898e8 --- /dev/null +++ b/src/fetchData.ts @@ -0,0 +1,9 @@ +/** + * 任務:實作一個 async 函式 `fetchData`,該函式應該能夠從指定的 URL 取得資料。 + * 範例:fetchData('https://jsonplaceholder.typicode.com/todos/1') 應該回傳一個包含 id、title 等屬性的物件 + * @param url - 要取得資料的 URL + * @returns - 回傳一個 Promise,該 Promise resolve 的值應該是從 URL 取得的資料 + */ + +// 請在下方寫下你的程式碼 + diff --git a/src/filterByProperty.test.ts b/src/filterByProperty.test.ts new file mode 100644 index 0000000..c2e5142 --- /dev/null +++ b/src/filterByProperty.test.ts @@ -0,0 +1,17 @@ +import { describe, it, expect } from 'vitest'; +import { filterByProperty } from './filterByProperty'; + +describe('filterByProperty 函式', () => { + it('應該根據屬性值過濾物件陣列', () => { + const items = [ + { name: 'Alice', age: 30 }, + { name: 'Bob', age: 25 }, + { name: 'Carol', age: 30 } + ]; + const result = filterByProperty(items, 'age', 30); + expect(result).toEqual([ + { name: 'Alice', age: 30 }, + { name: 'Carol', age: 30 } + ]); + }); +}); \ No newline at end of file diff --git a/src/filterByProperty.ts b/src/filterByProperty.ts new file mode 100644 index 0000000..7d7994d --- /dev/null +++ b/src/filterByProperty.ts @@ -0,0 +1,21 @@ +/** + * 任務:實作一個函式 `filterByProperty`,該函式應該過濾出陣列中的元素,其指定屬性的值等於給定值。 + * + * 範例: + * const array = [{ name: 'Alice', age: 20 }, { name: 'Bob', age: 20 }, { name: 'Charlie', age: 30 }]; + * filterByProperty(array, 'age', 20) 應該回傳 [{ name: 'Alice', age: 20 }, { name: 'Bob', age: 20 }] + * + * @param array - 一個物件的陣列 + * @param property - 要過濾的屬性名稱 + * @param value - 要過濾的屬性值 + * @returns - 回傳過濾後的陣列 + */ +export function filterByProperty(){ + // 請在此處寫下你的程式碼 +} + + +// 寫法推薦 +// export function filterByProperty(array: T[], property: K, value: T[K]): T[] { + +// } \ No newline at end of file diff --git a/src/objectAccessor.test.js b/src/objectAccessor.test.js new file mode 100644 index 0000000..4eb7927 --- /dev/null +++ b/src/objectAccessor.test.js @@ -0,0 +1,12 @@ +import { describe, it, expect } from 'vitest'; +import { createObjectAccessor } from './objectAccessor'; + +describe('設定物件存取器', () => { + it('應該允許對任意物件的屬性進行讀寫操作', () => { + const obj = { name: 'Alice', age: 25 }; + const accessor = createObjectAccessor(obj); + expect(accessor.get('name')).toBe('Alice'); + accessor.set('age', 26); + expect(accessor.get('age')).toBe(26); + }); +}); \ No newline at end of file diff --git a/src/objectAccessor.ts b/src/objectAccessor.ts new file mode 100644 index 0000000..feb747f --- /dev/null +++ b/src/objectAccessor.ts @@ -0,0 +1,17 @@ +/** + * 任務:實作一個函式 `createObjectAccessor`,該函式接收一個物件,並回傳一個新的物件,該物件有兩個方法:get 和 set。 + * get 方法用於獲取原物件的屬性值,set 方法用於設定原物件的屬性值。 + * + * 範例: + * const obj = { name: 'John', age: 30 }; + * const accessor = createObjectAccessor(obj); + * accessor.get('name') 應該回傳 'John' + * accessor.set('age', 31); + * accessor.get('age') 應該回傳 31 + * + * @param obj - 一個物件 + * @returns - 回傳一個物件,該物件有 get 和 set 兩個方法 + */ +export function createObjectAccessor(obj: T) { + // 請在此處寫下你的程式碼 +} \ No newline at end of file diff --git a/src/personalInfoModule.test.ts b/src/personalInfoModule.test.ts new file mode 100644 index 0000000..457f000 --- /dev/null +++ b/src/personalInfoModule.test.ts @@ -0,0 +1,9 @@ +import { describe, it, expect } from 'vitest'; +import { createPersonalInfo } from './personalInfoModule'; + +describe('個人資訊管理模組', () => { + it('應該創建個人資訊', () => { + const info = createPersonalInfo('John Doe', 30, 'john@example.com'); + expect(info).toEqual({ name: 'John Doe', age: 30, email: 'john@example.com' }); + }); +}); \ No newline at end of file diff --git a/src/personalInfoModule.ts b/src/personalInfoModule.ts new file mode 100644 index 0000000..a6173ca --- /dev/null +++ b/src/personalInfoModule.ts @@ -0,0 +1,26 @@ +/** + * 任務:實作一個函式 `createPersonalInfo`,建立一個個人資訊的物件。 + * + * 範例: + * createPersonalInfo('John Doe', 30, 'john@example.com') 應該回傳 + * { + * name: 'John Doe', + * age: 30, + * email: 'john@example.com' + * } + * + * @param name - 一個字串,表示姓名 + * @param age - 一個數字,表示年齡 + * @param email - 一個字串,表示電子郵件地址 + * @returns - 回傳一個物件,包含 name、age 和 email 屬性 + */ + +export interface PersonalInfo { + name: string; + age: number; + email: string; +} + +export function createPersonalInfo(name: string, age: number, email: string): PersonalInfo { + // 請在此處寫下你的程式碼 +} \ No newline at end of file diff --git a/src/shoppingCart.test.ts b/src/shoppingCart.test.ts new file mode 100644 index 0000000..4871381 --- /dev/null +++ b/src/shoppingCart.test.ts @@ -0,0 +1,22 @@ +import { describe, it, expect } from 'vitest'; +import { createShoppingCart } from './shoppingCart'; + +describe('購物車功能測試', () => { + it('應該可以加入商品並計算總價格', () => { + const cart = createShoppingCart(); + cart.addItem({ id: 'p1', name: '商品1', price: 100 }); + cart.addItem({ id: 'p2', name: '商品2', price: 200 }); + + expect(cart.getTotalPrice()).toBe(300); + expect(cart.getItemCount()).toBe(2); + }); + + it('清空購物車後,購物車內應該沒有商品', () => { + const cart = createShoppingCart(); + cart.addItem({ id: 'p1', name: '商品1', price: 100 }); + cart.clear(); + + expect(cart.getTotalPrice()).toBe(0); + expect(cart.getItemCount()).toBe(0); + }); +}); \ No newline at end of file diff --git a/src/shoppingCart.ts b/src/shoppingCart.ts new file mode 100644 index 0000000..9ca104d --- /dev/null +++ b/src/shoppingCart.ts @@ -0,0 +1,41 @@ +interface Product { + id: string; + name: string; + price: number; +} + +/** + * 任務:實作一個函式 `createShoppingCart`,該函式應該能夠創建一個購物車。 + * 範例:createShoppingCart() 應該回傳一個購物車物件,該物件應該有 addItem、getTotalPrice、getItemCount 和 clear 等方法 + * @returns - 回傳一個購物車物件 + */ +export function createShoppingCart() { + let items: Product[] = []; + + function addItem(item: Product) { + items.push(item); + } + /** + * getTotalPrice 方法:計算購物車中所有商品的總價 + * @returns - 回傳購物車中所有商品的總價 + * 範例:getTotalPrice() 應該回傳 300,假設購物車中有兩個商品,價格分別為 100 和 200 + */ + function getTotalPrice() { + // 請在此處寫下你的程式碼 + } + + function getItemCount() { + return items.length; + } + + function clear() { + items = []; + } + + return { + addItem, + getTotalPrice, + getItemCount, + clear + }; +} \ No newline at end of file diff --git a/src/stringProcessing.test.ts b/src/stringProcessing.test.ts new file mode 100644 index 0000000..1c6bfd9 --- /dev/null +++ b/src/stringProcessing.test.ts @@ -0,0 +1,8 @@ +import { describe, it, expect } from 'vitest'; +import { toUpperCase } from './stringProcessing'; + +describe('字串處理函式測試', () => { + it('應該將字串轉換為大寫', () => { + expect(toUpperCase('hello')).toBe('HELLO'); + }); +}); \ No newline at end of file diff --git a/src/stringProcessing.ts b/src/stringProcessing.ts new file mode 100644 index 0000000..66fd4a6 --- /dev/null +++ b/src/stringProcessing.ts @@ -0,0 +1,13 @@ +/** + * 任務:實作一個函式 `toUpperCase`,將輸入的字串轉換為大寫。 + * + * 範例: + * toUpperCase("hello") 應該回傳 "HELLO" + * toUpperCase("world") 應該回傳 "WORLD" + * + * @param str - 一個需要被轉換為大寫的字串 + * @returns - 回傳轉換後的大寫字串 + */ +export function toUpperCase(str: string): string { + // 請在此處寫下你的程式碼 +} \ No newline at end of file diff --git a/src/uniqueElements.test.ts b/src/uniqueElements.test.ts new file mode 100644 index 0000000..b82309d --- /dev/null +++ b/src/uniqueElements.test.ts @@ -0,0 +1,8 @@ +import { describe, it, expect } from 'vitest'; +import { uniqueElements } from './uniqueElements'; + +describe('唯一元素函式', () => { + it('應從陣列中回傳唯一元素', () => { + expect(uniqueElements([1, 2, 2, 3, 4, 4, 4])).toEqual([1, 2, 3, 4]); + }); +}); \ No newline at end of file diff --git a/src/uniqueElements.ts b/src/uniqueElements.ts new file mode 100644 index 0000000..dd9d85c --- /dev/null +++ b/src/uniqueElements.ts @@ -0,0 +1,9 @@ +/** + * 任務:實作一個函式 `uniqueElements`,該函式應該從給定的數字陣列中找出所有的唯一元素,並回傳一個新的陣列。 + * 範例:uniqueElements([1, 2, 2, 3, 4, 4, 4]) 應該回傳 [1, 2, 3, 4] + * @param array - 一個數字陣列 + * @returns - 回傳包含所有唯一元素的新陣列 + */ +export function uniqueElements(array: number[]): number[] { + // 請在此處寫下你的程式碼 +} \ No newline at end of file diff --git a/src/urlParsing.test.ts b/src/urlParsing.test.ts new file mode 100644 index 0000000..3539046 --- /dev/null +++ b/src/urlParsing.test.ts @@ -0,0 +1,14 @@ +import { describe, it, expect } from 'vitest'; +import { parseUrl } from './urlParsing'; + +describe('URL 解析函式測試', () => { + it('應正確解析 URL', () => { + const url = 'https://www.example.com/path'; + const result = parseUrl(url); + expect(result).toEqual({ + protocol: 'https:', + hostname: 'www.example.com', + path: '/path' + }); + }); +}); \ No newline at end of file diff --git a/src/urlParsing.ts b/src/urlParsing.ts new file mode 100644 index 0000000..c189e6b --- /dev/null +++ b/src/urlParsing.ts @@ -0,0 +1,23 @@ +/** + * 任務:實作一個函式 `parseUrl`,嘗試用 URL 方法,解析網址並 return 其組成部分。 + * + * 範例: + * parseUrl('https://www.example.com/path') 應該回傳 + * { + * protocol: 'https:', + * hostname: 'www.example.com', + * path: '/path' + * } + * + * @param url - 一個需要被解析的 URL + * @returns - 回傳一個物件,包含 protocol、hostname 和 path + */ +interface UrlParts { + protocol: string; + hostname: string; + path: string; +} + +export function parseUrl(url: string): UrlParts { + // 請在此處寫下你的程式碼 +} \ No newline at end of file diff --git a/src/userInfoExtension.test.ts b/src/userInfoExtension.test.ts new file mode 100644 index 0000000..057555e --- /dev/null +++ b/src/userInfoExtension.test.ts @@ -0,0 +1,9 @@ +import { describe, it, expect } from 'vitest'; +import { createFullUserInfo } from './userInfoExtension'; + +describe('使用者資訊擴充', () => { + it('應該正確合併使用者基本資訊和地址資訊', () => { + const user = createFullUserInfo({ name: 'John', age: 30, street: 'Main St', city: 'Metropolis' }); + expect(user).toEqual({ name: 'John', age: 30, street: 'Main St', city: 'Metropolis' }); + }); +}); \ No newline at end of file diff --git a/src/userInfoExtension.ts b/src/userInfoExtension.ts new file mode 100644 index 0000000..30b554e --- /dev/null +++ b/src/userInfoExtension.ts @@ -0,0 +1,37 @@ +interface BasicUserInfo { + name: string; + age: number; +} + +interface AddressInfo { + street: string; + city: string; +} + +/** + * 任務:請實作一個 interface 或 type,藉此來建立 `FullUserInfo`,將 `BasicUserInfo` 和 `AddressInfo` 兩個介面的資訊合併。 + * + * 範例: + * FullUserInfo 應該包含以下屬性: + * name: string; + * age: number; + * street: string; + * city: string; + */ + +// 請在此處寫下你的程式碼 + + +/** + * 任務:實作一個函式 `createFullUserInfo`,將使用者的基本資訊和地址資訊合併成一個物件。 + * + * 範例: + * createFullUserInfo({ name: 'John', age: 30, street: 'Main St', city: 'Metropolis' }) + * 應該回傳 { name: 'John', age: 30, street: 'Main St', city: 'Metropolis' } + * + * @param user - 一個物件,包含使用者的基本資訊和地址資訊 + * @returns - 回傳一個物件,表示合併後的使用者資訊 + */ +export function createFullUserInfo(user: FullUserInfo): FullUserInfo { + // 請在此處寫下你的程式碼 +} \ No newline at end of file diff --git a/src/utilityFunctionsModule.test.ts b/src/utilityFunctionsModule.test.ts new file mode 100644 index 0000000..2dc5072 --- /dev/null +++ b/src/utilityFunctionsModule.test.ts @@ -0,0 +1,13 @@ +import { describe, it, expect } from 'vitest'; +import { formatDate, roundNumber } from './utilityFunctionsModule'; + +describe('公用函式模組', () => { + it('應該正確格式化日期', () => { + const date = new Date('2023-01-01'); + expect(formatDate(date)).toBe('2023-01-01'); + }); + + it('應該四捨五入數字', () => { + expect(roundNumber(1.5)).toBe(2); + }); +}); \ No newline at end of file diff --git a/src/utilityFunctionsModule.ts b/src/utilityFunctionsModule.ts new file mode 100644 index 0000000..75fa335 --- /dev/null +++ b/src/utilityFunctionsModule.ts @@ -0,0 +1,25 @@ +/** + * 任務:實作一個函式 `formatDate`,將日期物件轉換為 'YYYY-MM-DD' 的格式。 + * + * 範例: + * formatDate(new Date('2023-01-01')) 應該回傳 '2023-01-01' + * + * @param date - 一個日期物件 + * @returns - 回傳一個字串,表示格式化後的日期 + */ +export function formatDate(date: Date): string { + // 請在此處寫下你的程式碼 +} + +/** + * 任務:實作一個函式 `roundNumber`,將數字四捨五入到最接近的整數。 + * + * 範例: + * roundNumber(1.5) 應該回傳 2 + * + * @param num - 一個數字 + * @returns - 回傳一個數字,表示四捨五入後的結果 + */ +export function roundNumber(num: number): number { + // 請在此處寫下你的程式碼 +} \ No newline at end of file From d6a93860e2cbc82fa1812f07c126c00de16fc5e8 Mon Sep 17 00:00:00 2001 From: JarDar Date: Thu, 4 Jan 2024 10:34:42 +0800 Subject: [PATCH 2/2] practice-1 --- src/ageClassification.ts | 15 +++++++-- src/arrayFiltering.ts | 4 +-- src/arraySum.ts | 11 ++++--- src/bookCategoryEnum.ts | 16 +++++----- src/booleanChecker.ts | 8 ++--- src/calculator.ts | 21 ++++++++----- src/dataProcessingModule.ts | 19 +++++++++--- src/dataStore.ts | 32 ++++++++++++-------- src/fetchData.test.ts | 13 +++++--- src/fetchData.ts | 7 ++++- src/filterByProperty.ts | 14 ++++++--- src/inputHandler.ts | 14 ++++++--- src/maxNumber.ts | 7 +++-- src/multiArray.ts | 8 ++--- src/numberSort.ts | 5 +-- src/objectAccessor.ts | 25 +++++++++++++-- src/personalInfoModule.ts | 23 +++++++++----- src/shoppingCart.ts | 57 ++++++++++++++++++----------------- src/stringProcessing.ts | 4 +-- src/stringReverse.ts | 7 +++-- src/studentTuple.ts | 6 ++-- src/temperatureConverter.ts | 3 +- src/todoInterface.ts | 17 ++++++++--- src/trafficLightEnum.ts | 11 ++++--- src/uniqueElements.ts | 5 +-- src/urlParsing.ts | 12 ++++++-- src/userInfoExtension.ts | 19 ++++++------ src/userInterface.ts | 13 +++++--- src/utilityFunctionsModule.ts | 8 +++-- src/vehicleInterface.ts | 15 ++++++--- 30 files changed, 266 insertions(+), 153 deletions(-) diff --git a/src/ageClassification.ts b/src/ageClassification.ts index 136289e..5301a74 100644 --- a/src/ageClassification.ts +++ b/src/ageClassification.ts @@ -11,5 +11,16 @@ * @returns - 回傳年齡的分類結果 */ export function classifyAge(age: number): string { - // 請在此處寫下你的程式碼 -} \ No newline at end of file + // 請在此處寫下你的程式碼 + 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'; + } +} diff --git a/src/arrayFiltering.ts b/src/arrayFiltering.ts index 5c52341..4bb2b2e 100644 --- a/src/arrayFiltering.ts +++ b/src/arrayFiltering.ts @@ -9,5 +9,5 @@ * @returns - 回傳只包含偶數的數字陣列 */ export function filterEvens(numbers: number[]): number[] { - // 請在此處寫下你的程式碼 -} \ No newline at end of file + return numbers.filter((number) => number % 2 === 0); +} diff --git a/src/arraySum.ts b/src/arraySum.ts index b0248ce..3132238 100644 --- a/src/arraySum.ts +++ b/src/arraySum.ts @@ -1,17 +1,18 @@ /** * 計算數字陣列的總和 * @param numbers - 要計算總和的數字陣列 - * + * * 範例: * 輸入: [1, 2, 3, 4, 5] * 輸出: 15 - * + * * 輸入: [-1, -2, -3] * 輸出: -6 - * + * * 輸入: [] * 輸出: 0 */ export function arraySum(numbers: number[]): number { - // 在此實現函式 -} \ No newline at end of file + // 在此實現函式 + return numbers.reduce((sum, number) => sum + number, 0); +} diff --git a/src/bookCategoryEnum.ts b/src/bookCategoryEnum.ts index fa2d6d6..e23d869 100644 --- a/src/bookCategoryEnum.ts +++ b/src/bookCategoryEnum.ts @@ -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) { - // 在此實現函式 -} \ No newline at end of file +export function getBookCategory(category: BookCategory): string { + return `Book category: ${category}`; +} diff --git a/src/booleanChecker.ts b/src/booleanChecker.ts index b4bd530..a13889e 100644 --- a/src/booleanChecker.ts +++ b/src/booleanChecker.ts @@ -1,10 +1,10 @@ /** * 判斷輸入的數字是否為正數 * @param number - 要判斷的數字 - * + * * 注意:這個函式目前有錯誤,需要修正。正確的實現應該是判斷輸入的數字是否大於 0。 */ export function isPositive(number: number): boolean { - // 故意寫錯的程式碼 - return number < 0; -} \ No newline at end of file + // 故意寫錯的程式碼 + return number > 0; +} diff --git a/src/calculator.ts b/src/calculator.ts index 1396ce2..6e14a10 100644 --- a/src/calculator.ts +++ b/src/calculator.ts @@ -4,7 +4,8 @@ * @param b - 第二個數字 */ export function add(a: number, b: number): number { - // 在此實現函式 + // 在此實現函式 + return a + b; } /** @@ -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; } /** @@ -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; } /** @@ -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; - } \ No newline at end of file + const sum = a + b; + return sum > 100 ? 100 : sum; +} diff --git a/src/dataProcessingModule.ts b/src/dataProcessingModule.ts index c89415e..77e9673 100644 --- a/src/dataProcessingModule.ts +++ b/src/dataProcessingModule.ts @@ -8,7 +8,8 @@ * @returns - 回傳一個數字陣列,表示排序後的結果 */ export function sortArray(numbers: number[]): number[] { - // 請在此處寫下你的程式碼 + // 請在此處寫下你的程式碼 + return numbers.sort((a, b) => a - b); } /** @@ -21,8 +22,12 @@ export function sortArray(numbers: number[]): number[] { * @param predicate - 一個函式,用來判斷元素是否符合條件 * @returns - 回傳一個數字陣列,表示過濾後的結果 */ -export function filterArray(numbers: number[], predicate: (num: number) => boolean): number[] { - // 請在此處寫下你的程式碼 +export function filterArray( + numbers: number[], + predicate: (num: number) => boolean +): number[] { + // 請在此處寫下你的程式碼 + return numbers.filter(predicate); } /** @@ -35,6 +40,10 @@ export function filterArray(numbers: number[], predicate: (num: number) => boole * @param transform - 一個函式,用來轉換元素 * @returns - 回傳一個數字陣列,表示轉換後的結果 */ -export function transformArray(numbers: number[], transform: (num: number) => number): number[] { - // 請在此處寫下你的程式碼 +export function transformArray( + numbers: number[], + transform: (num: number) => number +): number[] { + // 請在此處寫下你的程式碼 + return numbers.map(transform); } diff --git a/src/dataStore.ts b/src/dataStore.ts index 0d77eee..186d05a 100644 --- a/src/dataStore.ts +++ b/src/dataStore.ts @@ -11,18 +11,24 @@ * @returns - 回傳一個物件,該物件有 add 和 getAll 兩個方法 */ export function createDataStore() { - // 宣告一個名為 data 的變數,其為 T 型別的陣列,並初始化為空陣列 - // T 是一個泛型參數,代表任何型別 - // let data + // 宣告一個名為 data 的變數,其為 T 型別的陣列,並初始化為空陣列 + // T 是一個泛型參數,代表任何型別 + // let data + const data: T[] = []; - // 定義一個名為 add 的函式,該函式接收一個 T 型別的參數 item,並將 item 添加到 data 陣列中 - // 這裡的 T 也是泛型,所以 item 可以是任何型別 - // function add(){} + // 定義一個名為 add 的函式,該函式接收一個 T 型別的參數 item,並將 item 添加到 data 陣列中 + // 這裡的 T 也是泛型,所以 item 可以是任何型別 + // function add(){} + function add(item: T) { + data.push(item); + } - // 定義一個名為 getAll 的函式,該函式回傳 data 陣列的所有元素 - // 回傳的陣列中的元素型別也是 T,所以可以是任何型別 - //function getAll() - - - return { add, getAll }; -} \ No newline at end of file + // 定義一個名為 getAll 的函式,該函式回傳 data 陣列的所有元素 + // 回傳的陣列中的元素型別也是 T,所以可以是任何型別 + //function getAll() + function getAll(): T[] { + return [...data]; + } + + return { add, getAll }; +} diff --git a/src/fetchData.test.ts b/src/fetchData.test.ts index 9fc8670..7f47ccc 100644 --- a/src/fetchData.test.ts +++ b/src/fetchData.test.ts @@ -2,8 +2,11 @@ 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'); - }); -}); \ No newline at end of file + it('應該能從提供的 URL 取得資料', async () => { + const data = await fetchData( + 'https://jsonplaceholder.typicode.com/todos/1' + ); + + expect(data).toHaveProperty('id'); + }); +}); diff --git a/src/fetchData.ts b/src/fetchData.ts index 6b898e8..7777f96 100644 --- a/src/fetchData.ts +++ b/src/fetchData.ts @@ -5,5 +5,10 @@ * @returns - 回傳一個 Promise,該 Promise resolve 的值應該是從 URL 取得的資料 */ -// 請在下方寫下你的程式碼 +export async function fetchData(url: string): Promise { + const response = await fetch(url); + const data = await response.json(); + return data; +} +// 請在下方寫下你的程式碼 diff --git a/src/filterByProperty.ts b/src/filterByProperty.ts index 7d7994d..40b7dc6 100644 --- a/src/filterByProperty.ts +++ b/src/filterByProperty.ts @@ -10,12 +10,16 @@ * @param value - 要過濾的屬性值 * @returns - 回傳過濾後的陣列 */ -export function filterByProperty(){ - // 請在此處寫下你的程式碼 +export function filterByProperty( + array: T[], + property: K, + value: T[K] +): T[] { + // 請在此處寫下你的程式碼 + return array.filter((item) => item[property] === value); } - // 寫法推薦 // export function filterByProperty(array: T[], property: K, value: T[K]): T[] { - -// } \ No newline at end of file + +// } diff --git a/src/inputHandler.ts b/src/inputHandler.ts index 52a6830..49a9ab1 100644 --- a/src/inputHandler.ts +++ b/src/inputHandler.ts @@ -2,15 +2,19 @@ * 這個函式的目的是根據輸入的類型返回對應的描述。 * 你需要使用 TypeScript 的聯合類型來定義輸入可以是字串或數字,並在函式中返回對應的描述。 * 函式的返回值應該是一個字串,這個字串描述了輸入的類型和值。 - * + * * 範例: * 輸入: 'Hello' * 輸出: 'Input is a string: Hello' - * + * * 輸入: 123 * 輸出: 'Input is a number: 123' */ -export function handleInput(input) { - // 在此實現函式 -} \ No newline at end of file +export function handleInput(input: string | number) { + if (typeof input === 'string') { + return `Input is a string: ${input}`; + } else { + return `Input is a number: ${input}`; + } +} diff --git a/src/maxNumber.ts b/src/maxNumber.ts index f58c285..8037691 100644 --- a/src/maxNumber.ts +++ b/src/maxNumber.ts @@ -1,10 +1,11 @@ /** * 找出數字陣列中的最大數 * @param numbers - 要找出最大數的數字陣列 - * + * * 這個函式需要找出輸入的數字陣列中的最大數。你可以使用 JavaScript 的 Math.max 方法和展開運算符 (...) 來完成這個任務。 * Math.max 方法可以接受多個參數並返回其中的最大值,展開運算符可以將一個陣列轉換為多個參數。 */ export function findMaxNumber(numbers: number[]): number { - // 在此實現函式 -} \ No newline at end of file + // 在此實現函式 + return Math.max(...numbers); +} diff --git a/src/multiArray.ts b/src/multiArray.ts index 4ac5f42..f9aee65 100644 --- a/src/multiArray.ts +++ b/src/multiArray.ts @@ -2,12 +2,12 @@ * 這個函式的目的是將二維陣列的每個元素都加倍。 * 你需要使用 JavaScript 的 Array.prototype.map 方法來實現這個功能。 * 注意:原本的參數定義有誤,應該將參數定義為二維數字陣列。另外,函式的返回值也應該是二維數字陣列。 - * + * * 範例: * 輸入: [[1, 2], [3, 4], [5, 6]] * 輸出: [[2, 4], [6, 8], [10, 12]] */ -export function processMultiArray(arr) { - // 在此實現函式 -} \ No newline at end of file +export function processMultiArray(arr: number[][]): number[][] { + return arr.map((subArr) => subArr.map((num) => num * 2)); +} diff --git a/src/numberSort.ts b/src/numberSort.ts index f002d57..797eb03 100644 --- a/src/numberSort.ts +++ b/src/numberSort.ts @@ -2,7 +2,7 @@ * 這個函式的目的是將一個數字陣列進行排序。 * 你需要使用 JavaScript 的 Array.prototype.sort 方法來實現這個功能。 * 在 sort 方法的比較函式中,你應該返回 a - b 來實現升序排序。 - * + * * 範例: * 輸入: [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5] * 輸出: [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9] @@ -10,4 +10,5 @@ export function sortNumbers(numbers: number[]): number[] { // 在此實現函式 -} \ No newline at end of file + return numbers.sort((a, b) => a - b); +} diff --git a/src/objectAccessor.ts b/src/objectAccessor.ts index feb747f..a91ea63 100644 --- a/src/objectAccessor.ts +++ b/src/objectAccessor.ts @@ -12,6 +12,25 @@ * @param obj - 一個物件 * @returns - 回傳一個物件,該物件有 get 和 set 兩個方法 */ -export function createObjectAccessor(obj: T) { - // 請在此處寫下你的程式碼 -} \ No newline at end of file +// export function createObjectAccessor(obj: T) { +// // 請在此處寫下你的程式碼 +// return { +// get(key: keyof T) { +// return obj[key]; +// }, +// set(key: keyof T, value: T[keyof T]) { +// obj[key] = value; +// }, +// }; +// } +export function createObjectAccessor(obj: T) { + // 請在此處寫下你的程式碼 + return { + get(key: K) { + return obj[key]; + }, + set(key: K, value: T[K]) { + obj[key] = value; + }, + }; +} diff --git a/src/personalInfoModule.ts b/src/personalInfoModule.ts index a6173ca..8abffef 100644 --- a/src/personalInfoModule.ts +++ b/src/personalInfoModule.ts @@ -2,7 +2,7 @@ * 任務:實作一個函式 `createPersonalInfo`,建立一個個人資訊的物件。 * * 範例: - * createPersonalInfo('John Doe', 30, 'john@example.com') 應該回傳 + * createPersonalInfo('John Doe', 30, 'john@example.com') 應該回傳 * { * name: 'John Doe', * age: 30, @@ -16,11 +16,20 @@ */ export interface PersonalInfo { - name: string; - age: number; - email: string; + name: string; + age: number; + email: string; } -export function createPersonalInfo(name: string, age: number, email: string): PersonalInfo { - // 請在此處寫下你的程式碼 -} \ No newline at end of file +export function createPersonalInfo( + name: string, + age: number, + email: string +): PersonalInfo { + // 請在此處寫下你的程式碼 + return { + name: name, + age: age, + email: email, + }; +} diff --git a/src/shoppingCart.ts b/src/shoppingCart.ts index 9ca104d..42e3640 100644 --- a/src/shoppingCart.ts +++ b/src/shoppingCart.ts @@ -1,7 +1,7 @@ interface Product { - id: string; - name: string; - price: number; + id: string; + name: string; + price: number; } /** @@ -10,32 +10,33 @@ interface Product { * @returns - 回傳一個購物車物件 */ export function createShoppingCart() { - let items: Product[] = []; + let items: Product[] = []; - function addItem(item: Product) { - items.push(item); - } - /** - * getTotalPrice 方法:計算購物車中所有商品的總價 - * @returns - 回傳購物車中所有商品的總價 - * 範例:getTotalPrice() 應該回傳 300,假設購物車中有兩個商品,價格分別為 100 和 200 - */ - function getTotalPrice() { - // 請在此處寫下你的程式碼 - } + function addItem(item: Product) { + items.push(item); + } + /** + * getTotalPrice 方法:計算購物車中所有商品的總價 + * @returns - 回傳購物車中所有商品的總價 + * 範例:getTotalPrice() 應該回傳 300,假設購物車中有兩個商品,價格分別為 100 和 200 + */ + function getTotalPrice() { + // 請在此處寫下你的程式碼 + return items.reduce((acc, item) => acc + item.price, 0); + } - function getItemCount() { - return items.length; - } + function getItemCount() { + return items.length; + } - function clear() { - items = []; - } + function clear() { + items = []; + } - return { - addItem, - getTotalPrice, - getItemCount, - clear - }; -} \ No newline at end of file + return { + addItem, + getTotalPrice, + getItemCount, + clear, + }; +} diff --git a/src/stringProcessing.ts b/src/stringProcessing.ts index 66fd4a6..b616c7b 100644 --- a/src/stringProcessing.ts +++ b/src/stringProcessing.ts @@ -9,5 +9,5 @@ * @returns - 回傳轉換後的大寫字串 */ export function toUpperCase(str: string): string { - // 請在此處寫下你的程式碼 -} \ No newline at end of file + return str.toUpperCase(); +} diff --git a/src/stringReverse.ts b/src/stringReverse.ts index bf755eb..81ab7df 100644 --- a/src/stringReverse.ts +++ b/src/stringReverse.ts @@ -1,10 +1,11 @@ /** * 反轉輸入的字串 * @param str - 要反轉的字串 - * + * * 這個函式需要將輸入的字串反轉。你可以使用 JavaScript 的 String 和 Array 方法來完成這個任務。 * 首先,使用 split 方法將字串轉換為字元陣列。然後,使用 reverse 方法將陣列反轉。最後,使用 join 方法將反轉後的陣列轉換回字串。 */ export function reverseString(str: string): string { - // 在此實現函式 -} \ No newline at end of file + // 在此實現函式 + return str.split('').reverse().join(''); +} diff --git a/src/studentTuple.ts b/src/studentTuple.ts index de31b89..366b810 100644 --- a/src/studentTuple.ts +++ b/src/studentTuple.ts @@ -7,6 +7,6 @@ * 輸出: 'Alice: 85%' */ -export function printStudentInfo(student) { - // 在此實現函式 -} \ No newline at end of file +export function printStudentInfo(student: [string, number]) { + return `${student[0]}: ${student[1]}%`; +} diff --git a/src/temperatureConverter.ts b/src/temperatureConverter.ts index e60ab42..9d25fb3 100644 --- a/src/temperatureConverter.ts +++ b/src/temperatureConverter.ts @@ -4,4 +4,5 @@ * @returns 華氏溫度 */ export function celsiusToFahrenheit(celsius: number): number { -} \ No newline at end of file + return (celsius * 9) / 5 + 32; +} diff --git a/src/todoInterface.ts b/src/todoInterface.ts index c3bec91..251feab 100644 --- a/src/todoInterface.ts +++ b/src/todoInterface.ts @@ -2,18 +2,27 @@ * 待辦事項介面已被移除,你需要自己定義一個新的待辦事項介面。 * 待辦事項介面應該包含 id、task 和 completed 三個屬性,分別為數字型別、字串型別和布林型別。 */ - +interface Todo { + id: number; + task: string; + completed: boolean; +} /** * 新增待辦事項 * @param todos - 現有的待辦事項陣列 * @param task - 新的待辦事項的內容 - * + * * 範例: * 輸入: ([{ id: 1, task: 'Buy milk', completed: false }], 'Walk the dog') * 輸出: [{ id: 1, task: 'Buy milk', completed: false }, { id: 2, task: 'Walk the dog', completed: false }] */ export function addTodo(todos: Todo[], task: string): Todo[] { - // 在此實現函式 - return [...todos, newTodo]; + // 在此實現函式 + let newTodo: Todo = { + id: todos.length + 1, + task: task, + completed: false, + }; + return [...todos, newTodo]; } diff --git a/src/trafficLightEnum.ts b/src/trafficLightEnum.ts index 1e059f4..a63d98c 100644 --- a/src/trafficLightEnum.ts +++ b/src/trafficLightEnum.ts @@ -2,14 +2,17 @@ * 這個函式的目的是根據輸入的交通信號燈狀態返回對應的描述。 * 你需要使用 TypeScript 的 Enum 來定義交通信號燈的狀態,並在函式中返回對應的描述。 * Enum 應該包含 Red、Yellow 和 Green 三種狀態,並分別對應到 'Red'、'Yellow' 和 'Green' 三個字串。 - * + * * 範例: * 輸入: TrafficLight.Red * 輸出: 'The traffic light is Red' */ export enum TrafficLight { - + Red = 'Red', + Yellow = 'Yellow', + Green = 'Green', } -export function getTrafficLightStatus(light) { +export function getTrafficLightStatus(light: TrafficLight): string { + return `The traffic light is ${light}`; // 在此實現函式 -} \ No newline at end of file +} diff --git a/src/uniqueElements.ts b/src/uniqueElements.ts index dd9d85c..c9c94c5 100644 --- a/src/uniqueElements.ts +++ b/src/uniqueElements.ts @@ -5,5 +5,6 @@ * @returns - 回傳包含所有唯一元素的新陣列 */ export function uniqueElements(array: number[]): number[] { - // 請在此處寫下你的程式碼 -} \ No newline at end of file + // 請在此處寫下你的程式碼 + return [...new Set(array)]; +} diff --git a/src/urlParsing.ts b/src/urlParsing.ts index c189e6b..a9e5f05 100644 --- a/src/urlParsing.ts +++ b/src/urlParsing.ts @@ -2,7 +2,7 @@ * 任務:實作一個函式 `parseUrl`,嘗試用 URL 方法,解析網址並 return 其組成部分。 * * 範例: - * parseUrl('https://www.example.com/path') 應該回傳 + * parseUrl('https://www.example.com/path') 應該回傳 * { * protocol: 'https:', * hostname: 'www.example.com', @@ -19,5 +19,11 @@ interface UrlParts { } export function parseUrl(url: string): UrlParts { - // 請在此處寫下你的程式碼 -} \ No newline at end of file + // 請在此處寫下你的程式碼 + const urlObj = new URL(url); + return { + protocol: urlObj.protocol, + hostname: urlObj.hostname, + path: urlObj.pathname, + }; +} diff --git a/src/userInfoExtension.ts b/src/userInfoExtension.ts index 30b554e..4eaa08e 100644 --- a/src/userInfoExtension.ts +++ b/src/userInfoExtension.ts @@ -1,11 +1,11 @@ interface BasicUserInfo { - name: string; - age: number; + name: string; + age: number; } interface AddressInfo { - street: string; - city: string; + street: string; + city: string; } /** @@ -20,18 +20,19 @@ interface AddressInfo { */ // 請在此處寫下你的程式碼 - - +// interface FullUserInfo extends BasicUserInfo, AddressInfo {} +type FullUserInfo = BasicUserInfo & AddressInfo; /** * 任務:實作一個函式 `createFullUserInfo`,將使用者的基本資訊和地址資訊合併成一個物件。 * * 範例: - * createFullUserInfo({ name: 'John', age: 30, street: 'Main St', city: 'Metropolis' }) + * createFullUserInfo({ name: 'John', age: 30, street: 'Main St', city: 'Metropolis' }) * 應該回傳 { name: 'John', age: 30, street: 'Main St', city: 'Metropolis' } * * @param user - 一個物件,包含使用者的基本資訊和地址資訊 * @returns - 回傳一個物件,表示合併後的使用者資訊 */ export function createFullUserInfo(user: FullUserInfo): FullUserInfo { - // 請在此處寫下你的程式碼 -} \ No newline at end of file + // 請在此處寫下你的程式碼 + return user; +} diff --git a/src/userInterface.ts b/src/userInterface.ts index 4f06bda..d1ae14a 100644 --- a/src/userInterface.ts +++ b/src/userInterface.ts @@ -2,15 +2,20 @@ * 用戶介面已被移除,你需要自己定義一個新的用戶介面。 * 用戶介面應該包含 firstName 和 lastName 兩個屬性,都是字串型別。 */ +interface User { + firstName: string; + lastName: string; +} /** * 獲取用戶的全名 * @param user - 用戶物件,應該包含 firstName 和 lastName 兩個屬性 - * + * * 範例: * 輸入: { firstName: 'John', lastName: 'Doe' } * 輸出: 'John Doe' */ -export function getFullName(user: /* 你的用戶介面 */): string { - // 在此實現函式 -} \ No newline at end of file +export function getFullName(user: User /* 你的用戶介面 */): string { + // 在此實現函式 + return `${user.firstName} ${user.lastName}`; +} diff --git a/src/utilityFunctionsModule.ts b/src/utilityFunctionsModule.ts index 75fa335..ecb854c 100644 --- a/src/utilityFunctionsModule.ts +++ b/src/utilityFunctionsModule.ts @@ -8,7 +8,8 @@ * @returns - 回傳一個字串,表示格式化後的日期 */ export function formatDate(date: Date): string { - // 請在此處寫下你的程式碼 + // 請在此處寫下你的程式碼 + return date.toISOString().slice(0, 10); } /** @@ -21,5 +22,6 @@ export function formatDate(date: Date): string { * @returns - 回傳一個數字,表示四捨五入後的結果 */ export function roundNumber(num: number): number { - // 請在此處寫下你的程式碼 -} \ No newline at end of file + // 請在此處寫下你的程式碼 + return Math.round(num); +} diff --git a/src/vehicleInterface.ts b/src/vehicleInterface.ts index 54ef67c..1ef24d8 100644 --- a/src/vehicleInterface.ts +++ b/src/vehicleInterface.ts @@ -2,15 +2,20 @@ * 車輛介面已被移除,你需要自己定義一個新的車輛介面。 * 車輛介面應該包含 brand、model 和 year 三個屬性,分別為字串型別和數字型別。 */ - +interface Vehicle { + brand: string; + model: string; + year: number; +} /** * 獲取車輛的詳細資訊 * @param vehicle - 車輛物件,應該包含 brand、model 和 year 三個屬性 - * + * * 範例: * 輸入: { brand: 'Toyota', model: 'Corolla', year: 2020 } * 輸出: 'Toyota Corolla (2020)' */ -export function vehicleInfo(vehicle: /* 你的車輛介面 */): string { - // 在此實現函式 -} \ No newline at end of file +export function vehicleInfo(vehicle: Vehicle /* 你的車輛介面 */): string { + // 在此實現函式 + return `${vehicle.brand} ${vehicle.model} (${vehicle.year})`; +}