TypeScript多类型返回与类型转换:如何避免强制类型转换?
解决TypeScript返回类型不匹配问题(无需强制类型转换)
方法1:添加函数重载签名
通过为example定义重载签名,明确不同输入参数对应的返回类型,让TypeScript在调用时自动推断正确的类型:
type Message = { message: string; } // 重载签名:指定不同入参对应的返回类型 function example(arg1: true): string; function example(arg1: false): number; // 实现签名 function example(arg1: any): string | number { if(arg1) { return 'hello'; } return 5; } function doSomething(): Message { return { message: example(true) // 自动推断为string类型,无报错 }; }
方法2:使用类型守卫缩小类型范围
在获取example的返回值后,通过类型守卫明确其类型,消除TypeScript的类型歧义:
type Message = { message: string; } function example(arg1: any): string | number { if(arg1) { return 'hello'; } return 5; } function doSomething(): Message { const msgContent = example(true); // 使用typeof类型守卫判断类型 if (typeof msgContent === 'string') { return { message: msgContent }; } // 兜底逻辑,因传入true实际不会触发 throw new Error('Unexpected return type from example function'); }
方法3:利用泛型关联输入与返回类型
通过泛型约束,让example的返回类型与输入参数的类型直接关联,实现精确的类型推断:
type Message = { message: string; } function example<T extends boolean>(arg1: T): T extends true ? string : number { if(arg1) { return 'hello' as T extends true ? string : number; } return 5 as T extends true ? string : number; } function doSomething(): Message { return { message: example(true) // 自动推断为string类型 }; }
内容的提问来源于stack exchange,提问作者TToprak1
相关产品推荐
相关产品推荐

