You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript无法识别接口中的函数表达式联合类型问题

TypeScript 联合函数类型调用与类型提示问题

接口与实现代码

我定义了如下接口:

export default interface IUserManager {
    deleteUser: ((userId: string) => Promise<void>) | ((userName: string, userSurname: string, city: string) => Promise<void>);
}

在CompanyProcessor类中使用该接口的实例:

import MyUserManager from "path/to/IUserManager.ts"

class CompanyProcessor {
    private myUserManager: IUserManager;

    public constructor() {
        this.myUserManager = new MyUserManager(); // MyUserManager 实现了 IUserManager
    }

    public async deleteUser(userId: string): Promise<void> {
        await this.myUserManager.deleteUser(userid); // 报错:Expected 3 argument, but got 1. ts(2554)
    }
}

问题详情

  • 调用报错:调用单参数版本的deleteUser时,TypeScript提示需要传入3个参数,触发ts(2554)错误。
  • VSCode悬停提示异常:
    • 直接悬停接口中的deleteUser属性,能正常显示完整的联合函数类型;
    • 悬停CompanyProcessor中的调用代码时,仅显示参数数量最多的那个函数签名,原场景提示如下:
      (property) IUserManager.deleteUser: (userName: string, userSurname: string, city: string) => Promise<void>
      
  • 修改可选参数后的副作用:尝试把userSurname和city设为可选参数后,调用不再报错,但破坏了“必须传入3个参数”的原有约束,且此时悬停提示显示重载,但实际没有用到联合类型中的单参数函数,修改后的提示如下:
    (property) IUserManager.deleteUser: (userName: string, userSurname?: string, city?: string) => Promise<void> (+1 overload)
    

我的TypeScript版本是4.7.4。

内容的提问来源于stack exchange,提问作者user19766493

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 23:27:28