Typescript可选泛型类型

时间:2016-05-30 11:56:01

标签: generics typescript

我有以下日志记录方法:

  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是可选的,我希望能够拨打logData,而无需在我发送S时指定requestData类型方法:而不是:this.logData<T, any>('GET', data),我想调用this.logData<T>('GET', data)。有没有办法实现这个目标?

6 个答案:

答案 0 :(得分:67)

从TypeScript 2.3开始,您可以使用generic parameter defaults

private logData<T, S = {}>(operation: string, responseData: T, requestData?: S) {
  // your implementation here
}

答案 1 :(得分:15)

TS Update 2020: 赋予void将使泛型类型成为可选。

type SomeType<T = void> = OtherType<T>;

上面给出了默认值作为对象的答案使它成为可选值,但仍然为其赋值。


示例的默认类型值为{}

type BaseFunctionType<T1, T2> = (a:T1, b:T2) => void;

type FunctionType<T = {}> = BaseFunctionType<{name: string}, T>

const someFunction:FunctionType = (a) => {

}

someFunction({ name: "Siraj" });
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
// Expected 2 arguments, but got 1.(2554)

Playground Link


示例的默认通用类型值为void

type BaseFunctionType<T1, T2> = (a:T1, b:T2) => void;

type FunctionType<T = void> = BaseFunctionType<{name: string}, T>

const someFunction:FunctionType = (a) => {

}

someFunction({ name: "Siraj" })

这是使泛型成为可选的很好的读物。

Optional generic type in Typescript

Playground Link

答案 2 :(得分:8)

根据TypeScript 2.2(您可以在TS Playground中尝试),调用this.logData("GET", data)(类型为data的{​​{1}})会成功推断为T。< / p>

如果推断因您使用的TS版本而失败,则可以应用David Bohunek建议的过载。无论如何,确保第二个签名在声明之前然后定义,否则它将不参与可用的重载。

this.logData<T, {}>("GET", data)

答案 3 :(得分:1)

您可以像这样编写重载方法:

private logData<T>(operation: string, responseData: T);
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;
}

但我不认为你真的需要它,因为你不必写this.logData<T, any>('GET', data)而只需写this.logData('GET', data)T类型将被推测

答案 4 :(得分:1)

如果您正在类型/接口声明中寻找可选的泛型类型,这可能会有所帮助。

(来找这个的,只找到了处理通用函数声明的答案。Siraj's answer 让我走上了正轨。)

type ResponseWithMessage = {
  message: string;
};

interface ResponseWithData<T> extends ResponseWithMessage {
  data: T;
}

export type ResponseObject<T = void> = T extends void
  ? ResponseWithMessage
  : ResponseWithData<T>;

答案 5 :(得分:0)

Partial 怎么样?

<块引用>

构造一个类型,其中 Type 的所有属性都设置为 optional。此实用程序将返回表示给定类型的所有子集的类型。