如何在TypeScript对象中实现函数的条件类型定义?
在TypeScript对象中实现函数重载的正确方式
你之前的写法错误在于,TypeScript不允许在对象字面量内部直接写函数重载的声明,必须先通过类型注解(接口或直接写类型)来定义重载规则,再让对象实现这个类型。以下是两种正确的实现方式:
方式一:使用接口定义重载类型
先定义一个包含函数重载签名的接口,再让对象实现该接口:
interface MyObj { myfunc(input: string): number; myfunc(input: number): string; } const obj: MyObj = { myfunc(input: string | number): string | number { // 通过类型守卫处理不同参数类型 if (typeof input === 'string') { return input.length; // 符合string输入返回number的重载 } else { return input.toString(); // 符合number输入返回string的重载 } } };
方式二:直接在变量类型注解中定义重载
不需要单独声明接口,直接在变量的类型注解里写重载签名:
const obj: { myfunc(input: string): number; myfunc(input: number): string; } = { myfunc(input: string | number): string | number { if (typeof input === 'string') { return input.length; } else { return input.toString(); } } };
关键注意点
- 实现函数的参数类型必须覆盖所有重载的参数类型(这里用
string | number联合类型) - 实现函数的返回值类型要覆盖所有重载的返回值类型(
string | number) - 必须在函数内部通过类型守卫(比如
typeof判断)确保不同输入对应正确的返回值,这样TypeScript才能正确推导重载的类型。
内容的提问来源于stack exchange,提问作者yes
相关产品推荐
相关产品推荐

