搜索

首页  >  问答  >  正文

TypeScript中根据条件定义类型函数的输出方法

<p>我正在尝试为我的函数定义输出类型,我想根据<code>toNumberIfNeeded</code>标志在<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粉764836448498 天前563

全部回复(1)我来回复

  • P粉878542459

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

    你可以重构 textTransformer() 方法,接受一个泛型参数,并使用条件类型来检查 toNumberIfNeeded 是否为 truefalse。我认为 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
  • 取消回复