Что означает T там <T>($ winstonLoggerConfig <T>) => $ winstonLogger <T>в winston v3? - PullRequest
0 голосов
/ 10 февраля 2019

Я использую 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 голосов
/ 02 августа 2019

Конфигурация flowtype ищет отображение уровня журнала, которое будет передано здесь.Winston предоставляет одно из коробки: NpmLogLevels.

Вы можете использовать его следующим образом:

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

const logger = createLogger<NpmLogLevels>({
  transports: [new transports.Console()],
});
0 голосов
/ 14 февраля 2019

Я не знаю, откуда возникла ошибка, но я могу объяснить, что такое T.

T здесь является универсальным типом .Это полезно, когда вы хотите ограничить типы, но не слишком сильно.Например, представьте, что у вас есть тип Bag:

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

Вы можете счесть слишком ограничительным вводить цифры в свои сумки, скажем, вы хотите, чтобы в некоторых сумках были строки, а в других - цифры, вызатем изменил бы ваши типы на:

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

Но лучший способ сделать это состоит в том, чтобы иметь ограничения только на то, что вы хотите, вот реальное ограничение, которое мы хотим, это "сумка содержит только один вид вещей"(string или number).Вот где универсальные типы полезны:

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 s" не существует " Bag s вещей", и эта "вещь" должна быть определена.Поэтому при создании Bag необходимо указать точный тип Bag, который вы хотите использовать:

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

Это работает одинаково для функций и классов, они оба могут параметризоваться универсальным типом.

В вашем случае вам кажется, что у вас есть функция createLogger с прикрепленным к ней универсальным типом.Этот универсальный тип также ограничен $winstonLevels (это эквивалент number | string, который мы имели для сумок).Но я думаю, что не указание типа здесь не должно быть ошибкой типа, у вас есть объявление функции createLogger?

Код для примера игрушки: здесь .


Редактировать: кстати, какую версию потока вы используете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...