Свойства типа объявления объединенного интерфейса - PullRequest
0 голосов
/ 10 июля 2019

У меня проблемы с расширением интерфейсов сторонних библиотек по всему миру, так как импорт других файлов на корневом уровне приведет к тому, что файл объявления больше не будет глобальным.

Вот пример:

Я бы хотел добавить свойство "user" типа "MyUser" в объект запроса Express.Если бы это было типа MyUser, я мог бы просто сделать следующее:

declare namespace Express {
  interface Request {
    user: string;
  }
}

и затем где-нибудь еще:

...
function(..., req: Request, ...) {
  ...
  req.user; //its a string
  ...
}

и все будет работать отлично.Однако выполнение следующих действий не работает:

import MyUser from "../../src/types/MyUser";
declare namespace Express {
  interface Request {
    user: MyUser;
  }
}

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

1 Ответ

1 голос
/ 10 июля 2019

Если вы добавляете импорт, ваш файл является модулем, и поэтому любое определение является локальным (без импорта файл является устаревшим файлом сценария, и все в нем является глобальным).

Чтобы поместить интерфейс вглобальный объем и использование импорта используют declare global

import MyUser from "../../src/types/MyUser";
declare global {
    namespace Express {
        interface Request {
           user: MyUser;
        }
    }
}
...