我有以下记录方法:

  private logData<T, S>(operation: string, responseData: T, requestData?: S) {
    this.logger.log(operation + ' ' + this.url);
    if (requestData) {
      this.logger.log('SENT');
      this.logger.log(requestData);
    }
    this.logger.log('RECEIVED');
    this.logger.log(responseData);
    return responseData;
  }

requestData是可选的,当我不将requestData发送给方法时,我希望能够调用logData而不必指定S类型:我想调用this.logData<T>('GET', data),而不是:this.logData<T, any>('GET', data).

有没有办法做到这一点?

推荐答案

根据TypeScript 2.2(你可以在TS操场上try ),调用this.logData("GET", data)(data的类型为T)将成功推断为this.logData<T, {}>("GET", data).

如果您使用的TS版本的推理失败,则可以应用David Bohunek建议的重载.无论如何,请确保第二个签名在声明和定义之前就已存在,否则它将不会参与可用的重载.

// Declarations
private logData<T>(operation: string, responseData: T);
private logData<T, S>(operation: string, responseData: T, requestData?: S);
// Definition
private logData<T, S>(operation: string, responseData: T, requestData?: S) {
    // Body
}

Typescript相关问答推荐

Typescript问题和缩减器状态不会在单击时添加用途.属性'状态和调度'不存在于userContextType类型上'|null'

如何从具有给定键列表的对象类型的联合中构造类型

类型{...}的TypeScript参数不能赋给类型为never的参数''

无法将select选项的值设置为ngFor循环中的第一个元素

typescribe警告,explate—deps,useEffect依赖项列表

如何键入函数以只接受映射到其他一些特定类型的参数类型?

TypeScrip界面属性依赖于以前的属性-针对多种可能情况的简明解决方案

表单嵌套太深

接口重载方法顺序重要吗?

如何通过TypeScrip中的函数防止映射类型中未能通过复杂推理的any值

FatalError:Error TS6046:';--模块分辨率';选项的参数必须是:'; node ';,'; node 16';,'; node

使用TypeScrip5强制使用方法参数类型的实验方法修饰符

转换器不需要的类型交集

如何在React组件中指定forwardRef是可选的?

类型推断对React.ForwardRef()的引用参数无效

对有效枚举值的常量字符串进行常规判断

react 路由不响应参数

如何创建由一个帐户签名但使用另一个帐户支付的Hedera交易

如何从联合类型推断函数参数?

对于通过 Axios 获取的数据数组,属性map在类型never上不存在