我不知道您可以使用同級參數作為函數中的預設值。
JavaScript 從 ES2015 開始就支援預設參數值。你知道這一點。我知道這一點。我不知道的是,您可以使用兄弟 參數作為預設值本身。 (或者也許是「相鄰位置參數」?不知道如何稱呼這些。)
function myFunc(arg1, arg2 = arg1) { console.log(arg1, arg2); } myFunc("arg1!"); // "arg1!" "arg1!"
這也適用於類別建構子 - 我發現這對於使一些 PicPerf.io 程式碼更具可測試性非常有幫助。為此目的使用簡單的依賴注入是很常見的。讓我們來探索一下。
一個場景
與影像最佳化主題保持一致,假設您有一個 OptimizedImage 類別。向其建構函數提供圖像 URL,您可以檢索圖像的新最佳化緩衝區或快取版本。
class OptimizedImage { constructor( imageUrl: string, cacheService = new CacheService(), optimizeService = new OptimizeService() ) { this.imageUrl = imageUrl; this.cacheService = cacheService; this.optimizeService = optimizeService; } async get() { const cached = this.cacheService.get(this.imageUrl); // Return the previously optimized image. if (cached) return cached; const optimizedImage = await this.optimizeService .optimize(this.imageUrl); // Cache the optimized image for next time. return this.cacheService.put(this.imageUrl, optimizedImage); } } const instance = new OptimizedImage('https://macarthur.me/me.jpg'); const imgBuffer = await instance.get();
生產中使用的唯一建構子參數是 imageUrl,但注入 CacheService 和 OptimizeService 可以更輕鬆地使用模擬進行單元測試:
import { it, expect, vi } from 'vitest'; import { OptimizedImage } from './main'; it('returns freshly optimized image', async function () { const fakeImageBuffer = new ArrayBuffer('image!'); const mockCacheService = { get: (url) => null, put: vi.fn().mockResolvedValue(fakeImageBuffer), }; const mockOptimizeService = { optimize: (url) => fakeImageBuffer, }; const optimizedImage = new OptimizedImage( 'https://test.jpg', mockCacheService, mockOptimizeService ); const result = await optimizedImage.get(); expect(result).toEqual(fakeImageBuffer); expect(mockCacheService.put).toHaveBeenCalledWith( 'https://test.jpg', 'optimized image' ); });
讓它變得更加複雜
在這個範例中,這兩個服務類別僅在呼叫特定方法時才使用 imageUrl。但想像一下,如果他們需要將其傳遞給自己的建構函數。您可能會想要將實例化到 OptimizedImage 的建構子中(我就是這樣):
class OptimizedImage { constructor( imageUrl: string ) { this.imageUrl = imageUrl; this.cacheService = new CacheService(imageUrl); this.optimizeService = new OptimizeService(imageUrl); }
那是可行的,但現在 OptimizedImage 完全負責服務實例化,測試也變得更加麻煩。傳入服務實例的模擬並不是那麼容易。
您可以透過傳入模擬類別定義來解決這個問題,但是您隨後需要使用這些類別自己的建構函式建立這些類別的模擬版本,這使得測試變得更加乏味。幸運的是,還有另一種選擇:在參數清單的其餘部分中使用 imageUrl 參數。
共享同級參數
直到不久前我才意識到這是可能的。它的外觀如下:
export class OptimizedImage { constructor( imageUrl: string, // Use the same `imageUrl` in both dependencies. cacheService = new CacheService(imageUrl), optimizeService = new OptimizeService(imageUrl) ) { this.cacheService = cacheService; this.optimizeService = optimizeService; } async get() { const cached = this.cacheService.get(); // Return the previously optimized image. if (cached) return cached; const optimizedImage = await this.optimizeService.optimize(); // Cache the optimized image for next time. return this.cacheService.put(optimizedImage); } }
透過此設置,您可以像以前一樣輕鬆地模擬這些實例,而且類別的其餘部分甚至不需要保留 imageUrl 本身的實例。當然,實例化還是很簡單:
const instance = new OptimizedImage('https://macarthur.me/me.jpg'); const img = await instance.get();
相同的測試方法也保持不變:
import { it, expect, vi } from 'vitest'; import { OptimizedImage } from './main'; it('returns freshly optimized image', async function () { const mockCacheService = { get: () => null, put: vi.fn().mockResolvedValue('optimized image'), }; const mockOptimizeService = { optimize: () => 'optimized image', }; const optimizedImage = new OptimizedImage( 'https://test.jpg', mockCacheService, mockOptimizeService ); const result = await optimizedImage.get(); expect(result).toEqual('optimized image'); expect(mockCacheService.put).toHaveBeenCalledWith('optimized image'); });
這裡沒有什麼突破性的東西-只是一個小功能,讓我的生活更符合人體工學。我希望將來能遇到更多這樣的寶石。
以上是我不知道您可以使用同級參數作為函數中的預設值。的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

Python和JavaScript開發者的薪資沒有絕對的高低,具體取決於技能和行業需求。 1.Python在數據科學和機器學習領域可能薪資更高。 2.JavaScript在前端和全棧開發中需求大,薪資也可觀。 3.影響因素包括經驗、地理位置、公司規模和特定技能。

實現視差滾動和元素動畫效果的探討本文將探討如何實現類似資生堂官網(https://www.shiseido.co.jp/sb/wonderland/)中�...

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

學習JavaScript不難,但有挑戰。 1)理解基礎概念如變量、數據類型、函數等。 2)掌握異步編程,通過事件循環實現。 3)使用DOM操作和Promise處理異步請求。 4)避免常見錯誤,使用調試技巧。 5)優化性能,遵循最佳實踐。

如何在JavaScript中將具有相同ID的數組元素合併到一個對像中?在處理數據時,我們常常會遇到需要將具有相同ID�...

zustand異步操作中的數據更新問題在使用zustand狀態管理庫時,經常會遇到異步操作導致數據更新不及時的問題。 �...
