синтаксис объявления функции потока

64
8

Я пытаюсь документировать фабричную функцию в файле декларации. Моя цель - сделать поток осведомленным о моей простой фабрике.

Он используется в маршрутах koa v2, и это способ внести некоторые варианты в мой сервис.

Вот фабрика:

ctx.compose = function Compose<T: *>(service: Class<T>, options: ?Object): T {
return new service(_.extend({}, ctx._requestOptions, options));
};

Поскольку я использую koa v2, я создал тип KoaCtx в объявлении, который выглядит так:

declare type KoaCtx = {
params: { [key: string]: string },
request: {
query: { [key: string]: string },
body: { [key: string]: string | boolean | Array<any> | Number | Date | Object },
},
body: any,
req: any,
res: any,
state: any,
...
compose: compose: function <T: *>(service: Class<T>, options: ?Object): T
}

Я пробовал разные синтаксисы, но я продолжаю получать ошибки.

compose: function <T: *>(service: Class<T>, options: ?Object): T
^ Unexpected token :

Если я поставлю первый фрагмент кода внутри моего маршрута koa, он работает нормально! Я попытался добавить файл с определением ctx.compose в тег [include] в config потока, но он не работает.

Обновить

Пробовал эту декларацию:

declare function Compose<T: *>(service: Class<T>, options: ?Object): T;

declare type KoaCtx = {
...
compose: Compose<Class<*>>
};

Но, к сожалению, он все еще не работает.

спросил(а) 2021-01-19T16:53:36+03:00 6 месяцев, 2 недели назад
1
Решение
77

Тип функции выглядит

(argName1: Type1, argName2: Type2, ...restName: Array<RestType>) => ReturnType

тип функции с дженериками выглядит

<T>(argName1: Type1, argName2: Type2, ...restName: Array<RestType>) => ReturnType

Поэтому вы, вероятно, должны написать

declare type KoaCtx = {
...
compose: <T: *>(service: Class<T>, options: ?Object) => T
}

Тем не менее, вы используете экзистенциальный тип * как верхнюю границу для T Я не уверен, что это имеет смысл здесь. Поэтому я просто рекомендую писать

declare type KoaCtx = {
...
compose: <T>(service: Class<T>, options: ?Object) => T
}

Что касается вашего обновления, вы можете явно указывать параметры типа для псевдонимов типов, интерфейсов и классов. Так что вы могли бы написать

declare type Compose = <T>(service: Class<T>, options: ?Object) => T;

declare type KoaCtx = {
...
compose: Compose<MyClass>
};

но вы не можете этого сделать, если Compose является общей функцией.

ответил(а) 2021-01-19T16:53:36+03:00 6 месяцев, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема