[英]Infer argument type based on a prior argument's generic type
I have a generic type defined as follows:我有一个泛型类型定义如下:
export type LogBuilder<
T extends Logger<U>,
U extends LoggerOptions
> = (options: U) => T;
I can use this as follows:我可以按如下方式使用它:
interface WinstonLogger extends Logger<WinstonOptions> {
// Object.keys(Winston.config.syslog.levels)
emerg: Log;
alert: Log;
crit: Log;
error: Log;
warning: Log;
notice: Log;
info: Log;
debug: Log;
}
const declareWinstonLogger: LogBuilder<WinstonLogger, WinstonOptions> = (options) => {
return ...;
}
Notice that the WinstonLogger
extends with a generic type WinstonOptions
.请注意,
WinstonLogger
使用泛型类型WinstonOptions
。
Is there a way in LogBuilder
to infer U
from the generic type T<U>
, so that I don't need to specify the second type in LogBuilder<WinstonLogger, WinstonOptions>
? LogBuilder
中有没有办法从泛型类型T<U>
推断U
,这样我就不需要在LogBuilder<WinstonLogger, WinstonOptions>
中指定第二种类型?
I know I can define LogBuilder
to have a default value of LoggerOptions
for U
:我知道我可以将
LogBuilder
定义为U
的默认值LoggerOptions
:
export type LogBuilder<
T extends Logger<U>,
U extends LoggerOptions = LoggerOptions
> = (options: U) => T;
and I know Typescript has an infer
keyword, which I attempted unsuccessfully to solve this problem.我知道 Typescript 有一个
infer
关键字,我试图解决这个问题没有成功。 I'm hoping there's some way to combine these to drop the need to declare the second type generic in LogBuilder
, and have that default to WinstonOptions
, and having the above LogBuilder
definition has it default to LoggerOptions
- is that possible?我希望有某种方法可以将这些结合起来,以消除在
LogBuilder
中声明第二种泛型类型的需要,并将其默认设置为WinstonOptions
,并且将上述LogBuilder
定义默认为LoggerOptions
- 这可能吗?
The infer
keyword should work here. infer
关键字应该在这里工作。
export type LogBuilder<
T extends Logger<any>,
> = (options: T extends Logger<infer U> ? U : never) => T;
We can extract the type U
from Logger
in a conditional type for the options
parameter.我们可以在
options
参数的条件类型中从Logger
中提取类型U
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.