在winston v3中,T There <t>($ winstonLoggerConfig <t>)=> $ winstonLogger <t>是什么意思?

时间:2019-02-10 18:06:21

标签: javascript node.js flowtype winston flow-typed

我正在使用winston logger和wnat进行流式输入。但是我不知道该传递什么。 我的记录器:

const logger = createLogger({
...
});

Missing type annotation for `T`. `T` is a type parameter declared in function type [1] and was implicitly instantiated
at call of `createLogger` [2].

...

   startup/logger.js:35:16
                      v-------------
   35| const logger = createLogger({

References:
   flow-typed/npm/winston_v3.x.x.js:98:19
   98|     createLogger: <T>($winstonLoggerConfig<T>) => $winstonLogger<T>,
                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [1]

我也在流类型库中找到了这个

declare type $winstonLoggerConfig<T: $winstonLevels> = {
  exitOnError?: boolean,
  format?: $winstonFormat,
  level?: $Keys<T>,
  levels?: T,
  transports?: Array<$winstonTransport>
};

declare type $winstonLogger<T: $winstonLevels> = {
  [$Keys<T>]: (message: string, meta?: Object) => void,
  add: $winstonTransport => void,
  clear: () => void,
  configure: ($winstonLoggerConfig<T>) => void,
  log: (message: $winstonInfo<T>) => void,
  remove: $winstonTransport => void
};

那我该怎么办?

2 个答案:

答案 0 :(得分:3)

我不知道错误是从哪里来的,但是我可以解释T是什么。

这里的Tgeneric type。当您想限制类型但不要太多时,这很有用。例如,假设您有一个Bag类型:

type Bag = {
    name: string,
    content: Array<number>
}

您可能会发现限制过于严格,只能在袋子中放入数字,假设您想在某些袋子中放入字符串,而在另一些袋子中放入数字,然后将类型更改为:

type NumberBag = {
    name: string,
    content: Array<number>
}
type StringBag = {
    name: string,
    content: Array<string>
}

但是,执行此操作的更好方法是仅对所需内容进行约束,这里我们真正需要的约束是“一个袋子仅包含一种东西”(stringnumber )。这是泛型类型有用的地方:

type Bag<GenericType> = {
    name: string,
    content: Array<GenericType>
}

现在,您可能需要更具体一些,想象一下,您只希望包中包含数字或字符串(就像我们之前所做的那样):

type Bag<GenericType: number | string> = {
    name: string,
    content: Array<GenericType>
}

好吧,现在假设您要声明一个新包:

const firstBag: Bag = {
    name: "Integer bag", 
    content: [1,3,4]
};

如果仅执行此操作,则会出现一个(流程)错误,提示:

Cannot use `Bag` [1] without 1 type argument.
1: type Bag<GenericType: number | string> =

此参数所指的类型参数是通用类型(定义了包中的内容)。

换句话说,这意味着不存在“ 袋子”,没有“事物的袋子”,并且需要定义“事物”。因此,在创建Bag时,您需要指定要使用的确切Bag类型:

const firstBag: Bag<number> = {
    name: "Integer bag", 
    content: [1,3,4]
};

这对于函数和类是相同的,它们都可以通过泛型类型进行参数化。

对于您而言,您似乎拥有附加了通用类型的函数createLogger。此泛型类型也被约束为$winstonLevels(这相当于我们对袋子使用的number | string)。但是我认为,在此不指定类型不应该是类型错误,您是否声明了函数createLogger

玩具示例的代码为here


编辑:顺便问一下您使用的是哪个版本的流量?

答案 1 :(得分:2)

flowtype配置正在寻找要在此处传递的日志级别映射。 Winston开箱即用:NpmLogLevels

您可以像这样使用它:

import { createLogger, type NpmLogLevels } from 'winston';

const logger = createLogger<NpmLogLevels>({
  transports: [new transports.Console()],
});