搜尋

首頁  >  問答  >  主體

TypeScript中根據條件定義類型函數的輸出方法

<p>我正在嘗試為我的函數定義輸出類型,我想根據<code>toNumberIfNeeded</code>標誌在<code>string</code>和<code>number<code>string</code>和<code>number<code>類型之間設定條件,假設如果<code>toNumberIfNeeded</code>為真,則此函數將傳回一個數字類型,反之傳回字串類型。我該如何做? </p> <pre class="brush:php;toolbar:false;">interface Options { uppercase?: boolean; filterSpecialChars?: boolean; toNumberIfNeeded?: boolean; } export const textTransformer = (text: string, options?: Options) => { const { uppercase, filterSpecialChars, toNumberIfNeeded} = options || {}; // 我的處理邏輯程式碼 return toNumberIfNeeded ? parseInt(text) : text; }</pre> <p>預期的範例:</p> <pre class="brush:php;toolbar:false;">textTransformer('hello'); // 傳回字串類型 textTransformer('123', { toNumberIfNeeded: true }); // 回傳數字型別</pre>
P粉764836448P粉764836448465 天前539

全部回覆(1)我來回復

  • P粉878542459

    P粉8785424592023-08-15 13:04:14

    你可以重構textTransformer() 方法,接受一個泛型參數,並使用條件型別來檢查toNumberIfNeeded 是否為true# 或 false。我認為 TypeScript 無法自動縮小回傳值的類型。你必須使用類型斷言,否則返回類型將被推斷為 string | number

    interface Options {
      uppercase: boolean;
      filterSpecialChars: boolean;
      toNumberIfNeeded: boolean;
    }
    
    export const textTransformer = <T extends Options>(
      text: string,
      options?: T
    ): T["toNumberIfNeeded"] extends true ? number : string => {
      const {uppercase, filterSpecialChars, toNumberIfNeeded} =
        options || {};
      // 我的处理逻辑代码
    
      return (toNumberIfNeeded ? parseInt(text) : text) as ReturnType<
        typeof textTransformer
      >;
    };
    
    textTransformer("hello"); // 推断为 string
    textTransformer("123", {
      toNumberIfNeeded: true,
      uppercase: false,
      filterSpecialChars: false
    }); // 推断为 number

    回覆
    0
  • 取消回覆