TypeScript:可选参数搭配条件类型不生效问题排查
修复useData()函数返回类型问题
问题原因
你的useData()函数在未传参时返回Person | Animal,是因为泛型参数的默认值被设为keyof DataCategory,此时TypeScript会将未传参的情况推断为所有已知类型的联合类型,而非你期望的any。
解决方案
方案1:使用函数重载
通过重载明确区分两种调用场景,直接指定不同场景的返回类型:
// 已知类型定义 interface Person { name: string; age: number; } interface Animal { species: string; legs: number; } interface DataCategory { person: Person; animal: Animal; } function getData(): any { return {}; } // 重载签名:未传参时返回any function useData(): any; // 重载签名:传入指定key时返回对应类型 function useData<K extends keyof DataCategory>(key: K): DataCategory[K]; // 函数实现 function useData(key?: keyof DataCategory): any { return getData(); } // 调用示例 const unknownData = useData(); // 类型为any const personData = useData('person'); // 类型为Person const animalData = useData('animal'); // 类型为Animal
方案2:泛型条件类型结合默认值
通过给泛型参数设置void默认值,配合条件类型判断返回结果:
// 基础类型定义同方案1 interface Person { name: string; age: number; } interface Animal { species: string; legs: number; } interface DataCategory { person: Person; animal: Animal; } function getData(): any { return {}; } function useData<K extends keyof DataCategory | void = void>(key?: K): K extends keyof DataCategory ? DataCategory[K] : any { return getData(); } // 调用示例 const unknownData = useData(); // 类型为any const personData = useData('person'); // 类型为Person const animalData = useData('animal'); // 类型为Animal
这两种方案都能实现需求:传入指定key时返回对应已知类型,未传参时返回any。
内容的提问来源于stack exchange,提问作者AnsonH
相关产品推荐
相关产品推荐

