Javascript T在那里是什么意思<;T>;($winstologgerconfig<;T>;)=>$温斯顿洛格<;T>;在温斯顿v3?

Javascript T在那里是什么意思<;T>;($winstologgerconfig<;T>;)=>$温斯顿洛格<;T>;在温斯顿v3?,javascript,node.js,flowtype,winston,flow-typed,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]. ... st

我正在使用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]
const logger=createLogger({
...
});
“T”缺少类型批注`T`是在函数类型[1]中声明的类型参数,已隐式实例化
在调用“createLogger”[2]时。
...
startup/logger.js:35:16
五-------------
35 |常数记录器=createLogger({
参考资料:
流类型/npm/winston_v3.x.x.js:98:19
98 | createLogger:($winstonLoggerConfig)=>$winstonLogger,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [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
};
声明类型$winstologgerconfig={
exitOnError?:布尔值,
格式?:$winstonFormat,
级别?:$Keys,
级别?:T,
传输?:阵列
};
声明类型$winstologger={
[$Keys]:(消息:字符串,元?:对象)=>void,
添加:$winstonTransport=>void,
清除:()=>无效,
配置:($winstologgerconfig)=>void,
日志:(消息:$winstoinfo)=>void,
删除:$wintontransport=>void
};

那么我应该传递什么呢?

我不知道错误来自哪里,但我可以解释
t
是什么

T
这里是一个。当您想要约束类型但不太多时,这很有用。例如,假设您有一个
类型:

type Bag = {
    name: string,
    content: Array<number>
}
现在,您可能希望更具体一点,假设您只希望包中包含数字或字符串(正如我们之前所做的那样):

如果你只这样做,你会有一个(流)错误,说:

不能在没有1个类型参数的情况下使用'Bag`[1]。
1:纸袋=
此引用的类型参数是泛型类型(定义包中的内容)

换言之,这意味着没有“行李s”有“行李s物品”,需要定义“物品”。因此,在创建行李时,您需要指定要使用的确切行李类型:

const firstBag: Bag<number> = {
    name: "Integer bag", 
    content: [1,3,4]
};
const firstBag:Bag={
名称:“整数包”,
内容:[1,3,4]
};
这对函数和类的作用相同,它们都可以由泛型类型参数化

在您的情况下,您似乎有一个附加了泛型类型的函数
createLogger
。该泛型类型也被限制为
$winstonLevels
(这相当于我们为行李提供的
数字|字符串
).但是我认为在这里不指定类型不应该是类型错误,您有函数
createLogger
的声明吗

玩具示例的代码为



编辑:顺便问一下,您使用的是什么版本的流?

flowtype配置正在查找要在此处传递的日志级别映射。Winston提供了一个现成的映射:
NpmLogLevels

您可以这样使用它:

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

const logger = createLogger<NpmLogLevels>({
  transports: [new transports.Console()],
});
从“winston”导入{createLogger,键入NpmLogLevels};
const logger=createLogger({
transports:[新transports.Console()],
});

很抱歉,我已经修复了它,但我喜欢你的答案。感谢你以简单的方式向我解释了泛型类型。感谢你提供了这个漂亮、简单的答案。它直接解决了我遇到的类型错误-有时错误输出很难解析为修复。
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> =
const firstBag: Bag<number> = {
    name: "Integer bag", 
    content: [1,3,4]
};
import { createLogger, type NpmLogLevels } from 'winston';

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