Изменить интерфейс экспресс-запросов с внутренним классом [duplicate]

Я знаю, что это довольно старый вопрос, но, похоже, не существует окончательного ответа (насколько это возможно). Мне нужно было определить это значение как на * NIX-боксах, так и на на коробках Win X. Также из сценария выполненного CLI, а также скрипта, отличного от CLI. Следующей функцией является лучшее, что я придумал, которое заимствует разные концепции, о которых люди говорили за эти годы. Возможно, это может быть полезно:

function getServerAddress() {
    if(isset($_SERVER["SERVER_ADDR"]))
    return $_SERVER["SERVER_ADDR"];
    else {
    // Running CLI
    if(stristr(PHP_OS, 'WIN')) {
        //  Rather hacky way to handle windows servers
        exec('ipconfig /all', $catch);
        foreach($catch as $line) {
        if(eregi('IP Address', $line)) {
            // Have seen exec return "multi-line" content, so another hack.
            if(count($lineCount = split(':', $line)) == 1) {
            list($t, $ip) = split(':', $line);
            $ip = trim($ip);
            } else {
            $parts = explode('IP Address', $line);
            $parts = explode('Subnet Mask', $parts[1]);
            $parts = explode(': ', $parts[0]);
            $ip = trim($parts[1]);
            }
            if(ip2long($ip > 0)) {
            echo 'IP is '.$ip."\n";
            return $ip;
            } else
            ; // TODO: Handle this failure condition.
        }
        }
    } else {
        $ifconfig = shell_exec('/sbin/ifconfig eth0');
        preg_match('/addr:([\d\.]+)/', $ifconfig, $match);
        return $match[1];
    }
    }
}
9
задан Michał Lytek 20 August 2016 в 11:34
поделиться

2 ответа

После двух лет разработки TypeScript мне наконец удалось решить эту проблему.

В принципе, TypeScript имеет два типа объявлений типов модулей: «local» (обычные модули) и ambient (глобальные) , Второй вид позволяет написать объявление глобальных модулей, которые объединены с объявлением существующих модулей. В чем отличия между этими файлами?

d.ts файлы рассматриваются как декларации окружающего модуля, только если у них нет импорта. Если вы предоставляете строку импорта, теперь она рассматривается как нормальный файл модуля, а не глобальный, поэтому расширенные определения модулей не работают.

Итак, поэтому все решения, которые мы обсуждали здесь, не работают , Но, к счастью, поскольку TS 2.9 мы можем импортировать типы в объявления глобальных модулей с помощью синтаксиса import():

declare namespace Express {
  interface Request {
    user: import("./user").User;
  }
}

Итак, эта строка import("./user").User; делает магию, и теперь все работает:)

3
ответ дан Michał Lytek 16 August 2018 в 01:55
поделиться
  • 1
    Это правильный способ сделать это, по крайней мере, с помощью последних версий машинописных текстов – Jefferson Tavares 21 July 2018 в 14:33

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

Экспорт в порядке, как вы заметите, если попытаетесь скомпилировать это:

// app.ts  
import { User } from '../models/user'
let theUser = new User('theLogin', 'thePassword')

Похоже, вы пытаетесь увеличить объявление модуля Express, и вы действительно близки. Это должно сделать трюк:

// index.d.ts
import { User } from "./models/user";
declare module 'express' {
  interface Session {
    user: User;
    uuid: string;
  }
}

Однако правильность этого кода зависит, конечно, от первоначальной реализации файла декларации.

3
ответ дан Pelle Jacobs 16 August 2018 в 01:55
поделиться
  • 1
    Если я перемещаю оператор import внутри, я получаю ошибку: Import declarations in a namespace cannot reference a module.. Если я скопирую код в свой код, я получил: Import or export declaration in an ambient module declaration cannot reference module through relative module name.. И если я пытаюсь использовать неопознанный путь, я не могу найти свой файл, поэтому я переместил папку деклараций в ad_modules ad add path "declarations/models/user", но все же весь d.ts не работает - не вижу собственного расширения express сессии в intelisense или tsc. – Michał Lytek 28 August 2016 в 09:33
  • 2
    Я не знаком с этими ошибками, извините. Может быть, в вашей настройке есть что-то другое? Скомпилирует ли это для вас? gist.github.com/pellejacobs/498c997ebb8679ea90826177cf8a9bad . – Pelle Jacobs 28 August 2016 в 09:51
  • 3
    Таким образом, он работает, но по-прежнему не работает в реальном приложении. У меня есть объект экспресс-запроса с объектом сеанса, и у него есть другое объявленное пространство имен Express, а не модуль 'express': github.com/DefinitelyTyped/DefinitelyTyped/blob/master/… – Michał Lytek 30 August 2016 в 09:02
  • 4
    Для меня это тоже не работает. После добавления операторов импорта в файл tsd.d.ts весь файл перестает работать. (Я получаю ошибки в остальной части моего приложения для вещей, определенных в этом файле.) – Vern Jensen 21 December 2016 в 23:02
  • 5
    У меня такая же проблема. Он работает, если вы используете импорт в объявленном модуле внутри вашего .d.ts: declare module 'myModule' {import { FancyClass } from 'fancyModule'; export class MyClass extends FancyClass {} } – zunder 30 June 2017 в 18:13
Другие вопросы по тегам:

Похожие вопросы: