亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

TypeScript使用函數(shù)重載確定返回類型的實現(xiàn)方法

 更新時間:2024年03月20日 08:23:52   作者:不知名靚仔  
這篇文章主要介紹了TypeScript使用函數(shù)重載確定返回類型的實現(xiàn)方法,文中通過代碼示例講解的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下

自定義一個hooks

import { useLocation } from 'react-router-dom';

// 定義 QueryParamsKey 類型為 string 或 Record<string, string>
type QueryParamsKey = string | Record<string, string>;

// 定義返回類型
type QueryParamsResult = Record<string, string>;

const useGetQueryParams = (key: QueryParamsKey): QueryParamsResult => {
  const location = useLocation();
  const queryParams = new URLSearchParams(location.search);
  
  // 初始化返回結果
  let values: QueryParamsResult = {};

  // 類型守衛(wèi),判斷 key 是否為字符串
  if (typeof key === 'string') {
    values[key] = queryParams.get(key) || '';
  } else if (typeof key === 'object' && key !== null) {
    // 遍歷對象中的每個鍵,并獲取對應的查詢參數(shù)
    Object.keys(key).forEach((k) => {
      // 使用 key 中的值作為查詢參數(shù)的鍵
      values[k] = queryParams.get(key[k]) || '';
    });
  }
  
  return values;
};

export default useGetQueryParams;

問題:

使用 const {templateId} = useGetQueryParams(['templateId']) 提示類型“QueryParamsResultValues”上不存在屬性“templateId”。

解釋:

useGetQueryParams 函數(shù)的返回類型被定義為 QueryParamsResultValues,這是一個聯(lián)合類型 string | Record<string, string>。當你調(diào)用 useGetQueryParams(['templateId']) 時,根據(jù)參數(shù)類型(在這里是一個數(shù)組),返回值應該是一個 Record<string, string>。

問題是 TypeScript 無法在編譯時確定函數(shù)的返回類型是 string 還是 Record<string, string>,因為它依賴于函數(shù)的運行時行為。所以,當你嘗試解構返回值并訪問 templateId 屬性時,TypeScript 會拋出錯誤,因為它不確定返回的是不是一個對象。

解決

使用函數(shù)聲明式函數(shù)重載來讓 TypeScript 根據(jù)不同的參數(shù)類型來推斷不同的返回類型

import { useLocation } from 'react-router';

type QueryParamsKeys = string | string[];
type QueryParamsResult = Record<string, string | null>;

// 函數(shù)重載聲明
function useGetQueryParams(key: string): string | null;
function useGetQueryParams(keys: string[]): QueryParamsResult;

// 函數(shù)實現(xiàn)
function useGetQueryParams(keys: QueryParamsKeys): string | null | QueryParamsResult {
  const location = useLocation();
  const queryParams = new URLSearchParams(location.search);

  // 處理單個鍵的情況
  if (typeof keys === 'string') {
    return queryParams.get(keys);
  }
  // 處理鍵數(shù)組的情況
  else if (Array.isArray(keys)) {
    const values: QueryParamsResult = {};
    keys.forEach((k) => {
      values[k] = queryParams.get(k);
    });
    return values;
  }

  throw new Error('Invalid keys argument');
}

export default useGetQueryParams;

雖然我們有多個重載簽名,但只有一個函數(shù)實現(xiàn)。在這個實現(xiàn)內(nèi)部,我們處理所有可能的調(diào)用情況。當函數(shù)被調(diào)用時,TypeScript 編譯器會根據(jù)提供的參數(shù)類型和重載簽名來推斷出哪個重載簽名被使用,并據(jù)此檢查返回類型的一致性。

因此,與普通的 JavaScript 不同,TypeScript 的函數(shù)重載不是真的在運行時提供多個不同的函數(shù)實現(xiàn),而是在編譯時對函數(shù)調(diào)用的類型進行檢查和推斷。實際的 JavaScript 代碼中,仍然只有一個函數(shù)體

注意

在 TypeScript 中,你不能使用箭頭函數(shù)來進行函數(shù)重載。函數(shù)重載是 TypeScript 的一項特性,它允許你為同一個函數(shù)提供多個函數(shù)類型定義。但是,這項特性僅限于傳統(tǒng)的函數(shù)聲明,不適用于箭頭函數(shù),因為箭頭函數(shù)不能被命名。

// 函數(shù)聲明,可以進行重載
function greet(name: string): string;
function greet(age: number): string;
function greet(single: boolean): string;
function greet(value: string | number | boolean): string {
  // 實際的實現(xiàn)邏輯
  return `Hello, ${value}`;
}

這是因為在 JavaScript 運行時,不存在函數(shù)重載的概念;它是 TypeScript 在類型系統(tǒng)層面提供的,用于在編譯時檢查和推斷函數(shù)調(diào)用的類型。函數(shù)重載需要一系列具有相同名稱的函數(shù)聲明來實現(xiàn),而箭頭函數(shù)是匿名的,因此不能使用重載。

如果你希望在使用箭頭函數(shù)的同時模擬函數(shù)重載的行為,你可以定義一個具有多個簽名的類型,并將該類型賦給一個變量,然后將箭頭函數(shù)賦給這個變量:

// 定義函數(shù)類型
type GreetFunction = {
  (name: string): string;
  (age: number): string;
  (single: boolean): string;
};

// 定義變量并賦予箭頭函數(shù),但實際上這不是函數(shù)重載
const greet: GreetFunction = (value: string | number | boolean): string => {
  // 實際的實現(xiàn)邏輯
  return `Hello, ${value}`;
};

上述方法并不是真正的函數(shù)重載,只是模擬函數(shù)重載的行為。盡管這不是真正的重載,但它仍然可以根據(jù)調(diào)用時傳入的參數(shù)類型來返回不同的結果。

為什么箭頭函數(shù)不支持重載:

  • 匿名性質:箭頭函數(shù)通常是匿名的,它們沒有函數(shù)名。在 TypeScript 中定義函數(shù)重載時,需要多個具有相同名稱的聲明來表達不同的調(diào)用簽名。
  • 聲明方式:在 TypeScript 中,函數(shù)重載是通過列出多個具有相同名稱的函數(shù)聲明來實現(xiàn)的。這是通過在類型層面上對同一個函數(shù)名提供多個類型簽名來完成的。箭頭函數(shù)作為表達式,不具備這種聲明多個類型簽名的能力。

為什么在 TypeScript 中使用函數(shù)聲明進行重載:

  • 語法支持:TypeScript 的函數(shù)重載語法是專門為傳統(tǒng)的函數(shù)聲明設計的。
  • 編譯器推斷:TypeScript 編譯器可以根據(jù)重載簽名推斷出函數(shù)調(diào)用的返回類型,這為開發(fā)者提供了類型安全。

到此這篇關于TypeScript使用函數(shù)重載確定返回類型的實現(xiàn)方法的文章就介紹到這了,更多相關TypeScript確定返回類型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 詳解JS HTML Web端使用MQTT通訊測試

    詳解JS HTML Web端使用MQTT通訊測試

    這篇文章主要介紹了JS HTML Web端使用MQTT通訊測試,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-04-04
  • 用ES6的class模仿Vue寫一個雙向綁定的示例代碼

    用ES6的class模仿Vue寫一個雙向綁定的示例代碼

    本篇文章主要介紹了用ES6的class模仿Vue寫一個雙向綁定的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • js實現(xiàn)圖片和鏈接文字同步切換特效的方法

    js實現(xiàn)圖片和鏈接文字同步切換特效的方法

    這篇文章主要介紹了js實現(xiàn)圖片和鏈接文字同步切換特效的方法,涉及javascript操作文字及圖片的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • JavaScript動態(tài)插入CSS的方法

    JavaScript動態(tài)插入CSS的方法

    這篇文章主要介紹了JavaScript動態(tài)插入CSS的方法,兩個步驟就可以實現(xiàn)JavaScript動態(tài)插入CSS
    2015-12-12
  • JS作用域閉包、預解釋和this關鍵字綜合實例解析

    JS作用域閉包、預解釋和this關鍵字綜合實例解析

    這篇文章主要介紹了JS作用域閉包、預解釋和this關鍵字,結合實例形式分析了javascript作用域閉包、預解釋和this關鍵字在具體使用過程中的操作技巧與注意事項,需要的朋友可以參考下
    2016-12-12
  • js操作時間(年-月-日 時-分-秒 星期幾)

    js操作時間(年-月-日 時-分-秒 星期幾)

    js操作時間(年-月-日 時-分-秒 星期幾),需要的朋友可以參考下。
    2010-06-06
  • JS動態(tài)修改iframe內(nèi)嵌網(wǎng)頁地址的方法

    JS動態(tài)修改iframe內(nèi)嵌網(wǎng)頁地址的方法

    這篇文章主要介紹了JS動態(tài)修改iframe內(nèi)嵌網(wǎng)頁地址的方法,涉及javascript動態(tài)修改iframe中src屬性的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • 深入理解JavaScript柯里化的概念和原理

    深入理解JavaScript柯里化的概念和原理

    在JS編程中, 函數(shù)是一等公民, 具備了強大的靈活性和復用性,而柯里化作為一種高階技術, 可以進一步提升函數(shù)的復用性和靈活性,在本篇博客中, 我們將深入探討 JS 中柯里化的概念和原理, 并了解其在實際開發(fā)中的應用場景,需要的朋友可以參考下
    2023-06-06
  • JavaScript RegExp 對象用法詳解

    JavaScript RegExp 對象用法詳解

    這篇文章主要介紹了JavaScript RegExp 對象用法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09
  • 微信小程序自定義組件和通信的方法

    微信小程序自定義組件和通信的方法

    開發(fā)中常見的組件主要分為公共組件和頁面組件兩種,因此注冊組件的方式也分為兩種全局注冊和局部注冊,本文給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-06-06

最新評論