Nano Hash - криптовалюты, майнинг, программирование

Преобразование статического в динамический импорт в Typescript

У меня есть приложение Express.js, написанное на TypeScript (2.7.1), и я пытаюсь динамически импортировать модуль express-session. Насколько я понимаю, import session from 'express-session' должен быть эквивалентен let session = await import('express-session'), однако статический импорт работает нормально (если установлен express-session), а динамическая версия жалуется:

error TS2349: Cannot invoke an expression whose type lacks a call signature. 
Type '{ default: typeof session; Store: typeof Store; MemoryStore: typeof MemoryStore; }' 
has no compatible call signatures

Вот как выглядит мой файл после удаления статического импорта и окружения импорта try-catch:

import express from 'express'

export class MyServer {
  public app: express.Application

  constructor() {
    this.app = express()
    this.init()
  }

  async init() {
    try {

      const session = await import('express-session')

      this.app.use(session({secret: 'my_secure_secret'}))
      this.app.set('hasSession', true)
    } catch (e) {
      console.log('Failed to load session, continue without it')
      this.app.set('hasSession', false)
    }
  }

Ответы:


1

Функция import() фактически импортирует весь объект CommonJS exports. Проверяя типы из @types/express-session имеем:

[...]
declare function session(options?: session.SessionOptions): express.RequestHandler;

declare namespace session {
  interface SessionOptions {
    secret: string | string[];
    name?: string;
    store?: Store | MemoryStore;
    cookie?: express.CookieOptions;
    genid?(req: express.Request): string;
    rolling?: boolean;
    resave?: boolean;
    proxy?: boolean;
    saveUninitialized?: boolean;
    unset?: string;
  }
[...]
export = session;

На данный момент export = session на самом деле эквивалентно exports.default = session (все еще немного сбивает с толку тот факт, что компилятор понимает session как ссылку на функцию, а не как пространство имен), и это приводит к решению:

  async init() {
    try {

      const session = (await import('express-session')).default

      this.app.use(session({secret: 'my_secure_secret'}))
      this.app.set('hasSession', true)
    } catch (e) {
      console.log('Failed to load session, continue without it')
      this.app.set('hasSession', false)
    }
02.07.2019
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..