Пользовательский ввод в файл .d.ts

#typescript

#typescript

Вопрос:

Я пытаюсь добавить свойство в интерфейс запроса Express.

Это работает :

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

Это не :

 import { UserCursor } from "./util/userCursor"; // UserCursor is a class
declare namespace Express {
    export interface Request {
        user?: UserCursor;
    }
}
 

Ошибка, указанная во всех файлах, которые используют req.user , но не в файле выше:

 Property 'user' does not exist on type 'Request<ParamsDictionary, any, any, ParsedQs>'.
 

Почему? Как присвоить тип UserCursor Express.Request.user ?

Ответ №1:

Единственное, что я знаю, что tsc не будет принимать файлы, которые содержатся import/export в области видимости с declare ключевым словом, в качестве определения ввода, поэтому ваш приведенный выше код не работает.

Но вы могли import бы на более низком уровне внутри declare области видимости, что означает, что следующий код будет работать:

 declare namespace Express {
  export interface Request {
    user?: import("./util/userCursor").UserCursor;
  }
}

 

Ответ №2:

Для потомков один из ответов на этот вопрос следующий:

 import { UserCursor } from "./util/userCursor";
declare global {
    namespace Express {
        export interface Request {
            user?: UserCursor;
        }
    }
}
 

По какой-то причине, кажется, что все, что нужно, выполняет свою работу. declare global ответ tmhao2005 выглядит лучше, и я слышал, что это не очень хорошая практика.