繁体   English   中英

根据先前参数的泛型类型推断参数类型

[英]Infer argument type based on a prior argument's generic type

我有一个泛型类型定义如下:

export type LogBuilder<
  T extends Logger<U>,
  U extends LoggerOptions
> = (options: U) => T;

我可以按如下方式使用它:

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 ...;
}

请注意, WinstonLogger使用泛型类型WinstonOptions

LogBuilder中有没有办法从泛型类型T<U>推断U ,这样我就不需要在LogBuilder<WinstonLogger, WinstonOptions>中指定第二种类型?


我知道我可以将LogBuilder定义为U的默认值LoggerOptions

export type LogBuilder<
  T extends Logger<U>,
  U extends LoggerOptions = LoggerOptions
> = (options: U) => T;

我知道 Typescript 有一个infer关键字,我试图解决这个问题没有成功。 我希望有某种方法可以将这些结合起来,以消除在LogBuilder中声明第二种泛型类型的需要,并将其默认设置为WinstonOptions ,并且将上述LogBuilder定义默认为LoggerOptions - 这可能吗?

infer关键字应该在这里工作。

export type LogBuilder<
  T extends Logger<any>,
> = (options: T extends Logger<infer U> ? U : never) => T;

我们可以在options参数的条件类型中从Logger中提取类型U

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM