После двух лет разработки TypeScript мне наконец удалось решить эту проблему.
В принципе, TypeScript имеет два типа объявлений типов модулей: «local» (обычные модули) и ambient (глобальные) , Второй вид позволяет написать объявление глобальных модулей, которые объединены с объявлением существующих модулей. В чем отличия между этими файлами?
d.ts
файлы рассматриваются как декларации окружающего модуля, только если у них нет импорта. Если вы предоставляете строку импорта, теперь она рассматривается как нормальный файл модуля, а не глобальный, поэтому расширенные определения модулей не работают.
Итак, поэтому все решения, которые мы обсуждали здесь, не работают , Но, к счастью, поскольку TS 2.9 мы можем импортировать типы в объявления глобальных модулей с помощью синтаксиса import()
:
declare namespace Express {
interface Request {
user: import("./user").User;
}
}
Итак, эта строка import("./user").User;
делает магию, и теперь все работает:)
Скобка означает, что конец диапазона включен - он включает в себя указанный элемент. Скобка означает, что конец является исключительным и не содержит элемент, указанный в списке. Таким образом, для [first1, last1)
диапазон начинается с first1
(и включает его), но заканчивается непосредственно перед last1
.
Предполагая целые числа:
Концепция интервальной нотации появляется в как , так и в области математики и информатики. Математическая нотация [
, ]
, (
, )
обозначает область (или диапазон ) интервала.
[
и ]
означают: число включено, эта сторона интервала закрыта , (
и )
означает: число исключено. Эта сторона интервала открыта . Интервал со смешанными состояниями называется «полуоткрытым» .
Например, диапазон последовательных целых чисел из 1 .. 10 (включительно) было бы обозначено как таковое:
Обратите внимание, как слово inclusive
был использован. Если мы хотим исключить конечную точку, но «накрыть» тот же диапазон, нам нужно переместить конечную точку:
Для левого и правого краев интервала есть фактически 4 перестановки:
(1,10) = 2,3,4,5,6,7,8,9 Set has 8 elements
(1,10] = 2,3,4,5,6,7,8,9,10 Set has 9 elements
[1,10) = 1,2,3,4,5,6,7,8,9 Set has 9 elements
[1,10] = 1,2,3,4,5,6,7,8,9,10 Set has 10 elements
Как это относится к математике и информатике?
Массив индексы имеют тенденцию использовать различное смещение в зависимости от того, в каком поле вы находитесь:
Эти различия могут приводить к ошибкам после ошибки после ошибки , aka, by-one при реализации математических алгоритмов, таких как -lops.
Если у нас есть набор или массив, скажем, о первых нескольких простых числах [ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 ]
, математики ссылались бы на первый элемент как на 1st
absolute . т.е. используя индексную нотацию для обозначения индекса:
Некоторые языки программирования, в противоположность этому, относятся к первому элементу как к элементу zero'th
относительного .
Поскольку индексы массива находятся в диапазоне [0, N-1], тогда для ясности было бы «приятно» сохранить то же числовое значение для диапазона 0 .. N вместо добавления текстового шума такой как смещение -1
.
Например, на C или JavaScript для итерации по массиву из N элементов программист должен написать общую идиому i = 0, i < N
с интервалом [0, N) вместо немного более подробных [0, N-1]:
function main() {
var output = "";
var a = [ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 ];
for( var i = 0; i < 10; i++ ) // [0,10)
output += "[" + i + "]: " + a[i] + "\n";
if (typeof window === 'undefined') // Node command line
console.log( output )
else
document.getElementById('output1').innerHTML = output;
}
<html>
<body onload="main();">
<pre id="output1"></pre>
</body>
</html>
Математики, так как они начинают отсчет с 1, вместо этого будет использовать номенклатуру i = 1, i <= N
, но теперь нам нужно исправить смещение массива на языке с нулевым значением.
e. g.
function main() {
var output = "";
var a = [ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 ];
for( var i = 1; i <= 10; i++ ) // [1,10]
output += "[" + i + "]: " + a[i-1] + "\n";
if (typeof window === 'undefined') // Node command line
console.log( output )
else
document.getElementById( "output2" ).innerHTML = output;
}
<html>
<body onload="main()";>
<pre id="output2"></pre>
</body>
</html>
Помимо:
В языках программирования, основанных на 0, может потребоваться kludge фиктивного нулевого элемента использовать математический 1-основанный алгоритм. например Python Index Start
Интервальная нотация также важна для чисел с плавающей запятой, чтобы избежать тонких ошибок.
Когда занимающихся числами с плавающей запятой, особенно в компьютерной графике (цветовое преобразование, вычислительная геометрия, ускорение / смешивание анимации и т. д.) часто используются нормированные числа. То есть цифры между 0.0 и 1.0.
Важно знать случаи кросс, если конечные точки включительно или exclusive :
Где M - некоторая машина epsilon . Вот почему вы иногда можете видеть икону const float EPSILON = 1e-#
в коде C (например, 1e-6
) для 32-битного числа с плавающей запятой. Этот вопрос SO Обеспечивает ли EPSILON что-нибудь? имеет некоторые предварительные данные. Более подробный ответ см. В FLT_EPSILON
и книге Дэвида Голдберга . Что каждый компьютерный ученый должен знать о арифметике с плавающей точкой
. Некоторые реализации генератора случайных чисел random()
могут создавать значения в диапазоне 0.0 .. 0.999 ... вместо более удобного 0.0 .. 1.0. Правильные комментарии в коде будут документировать это как [0.0,1.0) или [0.0,1.0], поэтому нет никакой двусмысленности в отношении использования.
Пример:
random()
. Вы конвертируете три значения с плавающей запятой в 8-битные значения без знака для создания 24-битного пикселя с красными, зелеными и синими каналами соответственно. В зависимости от выходного интервала random()
вы можете получить near-white
(254,254,254) или white
(255,255,255).
+--------+-----+
|random()|Byte |
|--------|-----|
|0.999...| 254 | <-- error introduced
|1.0 | 255 |
+--------+-----+
Для более подробная информация о точности и надежности с плавающей точкой с интервалами см. в Обнаружение столкновений в режиме реального времени в режиме реального времени , глава 11 Численная устойчивость , раздел 11.3 Надежное использование точек с плавающей запятой .
Это может быть математическое соглашение в определении интервала, где квадратные скобки означают «экстремальные включительные» и круглые скобки «экстремальные исключительные».
[a,b]
включает в себя конечные точки. (a,b)
исключает их. В вашем случае включена конечная точка в начале интервала, но конец исключен. Таким образом, это означает интервал «first1 & lt; = x & lt; last1».
Полупрозрачные интервалы полезны при программировании, поскольку они соответствуют общей идиоме для цикла:
for (int i = 0; i < n; ++i) { ... }
Здесь i находится в диапазоне [0, n).