可选的泛型类型

我有以下的日志记录方法:

  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)

有办法做到吗?

121716 次浏览

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

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类型

根据 TypeScript 2.2(您可以在 TS Playground 中尝试) ,调用 this.logData("GET", data)(使用 T类型的 data)将成功推断为 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 2.3开始,您可以使用 泛型参数默认值

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

输入内地人才计划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)

游乐场连结


具有默认泛型类型值的示例是 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" })

这是一本关于使泛型成为可选的好书。

Typecript 中的可选泛型类型

游乐场连结

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

(来找这个,只找到了处理泛型函数声明的答案。 Siraj 的回答让我找到了正确的方向。)

type ResponseWithMessage = {
message: string;
};


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


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

只有一部分呢?

构造一个将 Type 的所有属性设置为可选的类型。此实用工具将返回表示给定类型的所有子集的类型。

  • 在需要某种对象的地方,void不能很好地发挥作用。编辑: 打得非常好,你只需要考虑这样一个事实 void将覆盖您合并它的任何内容(void & string是 基本上 void)-这可能是一个你想要的
  • unknown
  • {}基本上与 unknown相同
interface OffsetPagination {
offset: number;
limit: number;
}


interface PagePagination {
page: number;
size: number;
}


type HttpListParams<
PaginationType extends OffsetPagination | PagePagination | void = void,
Params = {
filter?: string;
},
> = PaginationType extends void ? Params : PaginationType & Params;

这是游乐场