如何在TypeScript中根据条件定义函数输出类型?
实现根据参数动态切换函数返回类型
要让textTransformer根据toNumberIfNeeded的取值返回对应类型,你可以用TypeScript函数重载或者泛型条件类型来实现,下面是两种可行方案:
方案一:函数重载
直接定义多个函数签名,明确不同参数组合对应的返回类型:
interface Options { uppercase?: boolean; filterSpecialChars?: boolean; toNumberIfNeeded?: boolean; } // 重载签名1:不带options或toNumberIfNeeded为false/未传,返回string export function textTransformer(text: string): string; // 重载签名2:toNumberIfNeeded为true,返回number export function textTransformer(text: string, options: Options & { toNumberIfNeeded: true }): number; // 重载签名3:其他options组合,返回string export function textTransformer(text: string, options: Options): string; // 实现函数 export function textTransformer(text: string, options?: Options) { const { uppercase, filterSpecialChars, toNumberIfNeeded } = options || {}; // 你的处理逻辑 return toNumberIfNeeded ? parseInt(text) : text; }
调用时TypeScript会自动推断返回类型:
textTransformer('hello'); // 类型推断为string textTransformer('123', { toNumberIfNeeded: true }); // 类型推断为number textTransformer('abc', { uppercase: true }); // 类型推断为string
方案二:泛型结合条件类型
通过泛型约束Options的具体类型,用条件类型动态推导返回值:
// 定义泛型Options,让toNumberIfNeeded可以是字面量true/false或者undefined type Options<T extends boolean | undefined = undefined> = { uppercase?: boolean; filterSpecialChars?: boolean; toNumberIfNeeded?: T; }; // 函数返回类型根据T的取值判断:T为true则返回number,否则返回string export const textTransformer = <T extends boolean | undefined>( text: string, options?: Options<T> ): T extends true ? number : string => { const { uppercase, filterSpecialChars, toNumberIfNeeded } = options || {}; // 你的处理逻辑 return (toNumberIfNeeded ? parseInt(text) : text) as any; };
调用时的类型推断效果和方案一一致:
textTransformer('hello'); // string textTransformer('123', { toNumberIfNeeded: true }); // number textTransformer('test', { filterSpecialChars: true }); // string
注意:方案二中的as any是因为TypeScript无法自动识别条件类型的返回值匹配,需要手动断言,这是当前TypeScript的局限。
内容的提问来源于stack exchange,提问作者Epple
相关产品推荐
相关产品推荐

