function getMessage( query: number | MessageType, count = 10 ): Message[] | Message | undefined { if (typeof query === "number") { return data.find(message => message.id === query); } else { return data.filter(message => message.type === query).splice(0, count); } } /** ✅ ojbk, 不错报 */ getMessage(1, 10);
重载过程
TypeScript 重载的过程是,拿传入的参数和重载的方法签名列表中由上往下逐个匹配,直到找到一个完全匹配的函数签名,否则报错。所以推荐的做法是将签名更加具体的重载放上面,不那么具体的放后面。
/** ✅*/ function getMessage(type: MessageType, count?: number): Message[]; function getMessage(id: number): Message | undefined; /** 🚨*/ function getMessage(id: number): Message | undefined; function getMessage(type: MessageType, count?: number): Message[];
像上面示例中正确做法这样,如果说入参个数只有一个,那可以直接跳过第一个函数签名,无须做入参类型的判断。