我有以下日志记录方法:
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)
。有没有办法实现这个目标?
答案 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)
示例的默认通用类型值为
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" })
这是使泛型成为可选的很好的读物。
答案 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。此实用程序将返回表示给定类型的所有子集的类型。