Я знаю, что это довольно старый вопрос, но, похоже, не существует окончательного ответа (насколько это возможно). Мне нужно было определить это значение как на * 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];
}
}
}
После двух лет разработки TypeScript мне наконец удалось решить эту проблему.
В принципе, TypeScript имеет два типа объявлений типов модулей: «local» (обычные модули) и ambient (глобальные) , Второй вид позволяет написать объявление глобальных модулей, которые объединены с объявлением существующих модулей. В чем отличия между этими файлами?
d.ts
файлы рассматриваются как декларации окружающего модуля, только если у них нет импорта. Если вы предоставляете строку импорта, теперь она рассматривается как нормальный файл модуля, а не глобальный, поэтому расширенные определения модулей не работают.
Итак, поэтому все решения, которые мы обсуждали здесь, не работают , Но, к счастью, поскольку TS 2.9 мы можем импортировать типы в объявления глобальных модулей с помощью синтаксиса import()
:
declare namespace Express {
interface Request {
user: import("./user").User;
}
}
Итак, эта строка import("./user").User;
делает магию, и теперь все работает:)
Я думаю, что проблема, с которой вы сталкиваетесь, больше связана с расширением объявлений модулей, а затем с типом ввода.
Экспорт в порядке, как вы заметите, если попытаетесь скомпилировать это:
// 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;
}
}
Однако правильность этого кода зависит, конечно, от первоначальной реализации файла декларации.
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
declare module 'myModule' {import { FancyClass } from 'fancyModule'; export class MyClass extends FancyClass {} }
– zunder
30 June 2017 в 18:13