TypeScript var vs import
В TypeScript, в чем разница между
import http = require('http');
и
var http = require('http');
Я вижу оба способа использования в источнике кода, являются ли они взаимозаменяемыми?
Ответы
Ответ 1
Ваш оператор import
TypeScript и не будет работать как-есть в Node. Вам нужно будет сначала скомпилировать (перевести?) Его на JavaScript. Вы можете прочитать документы TypeScript для получения дополнительной информации о том, как работает TypeScript import
. См. Раздел "Going External" в разделе Docs модулей.
В JavaScript есть и ключевое слово import
, но оно не работает, как работает TypeScript import
. Он будет работать только в версиях Node, которые поддерживают модули ES6. Существуют различия между этими import
и require
, о которых вы можете прочитать в "Модули ES6: окончательный синтаксис" . Это import
- это то, что вы можете сравнить/контрастировать с require
, но не реально var
.
Ответ 2
У меня был тот же запрос. Просто нашел это в разделе "Псевдоним" Typescript:
Это похоже на использование var, но также работает над значениями типа и пространства имен импортированного символа. Важно отметить, что для значений импорт является отличной ссылкой от исходного символа, , поэтому изменения в aliased var не будут отображаться в исходной переменной
https://www.typescriptlang.org/docs/handbook/namespaces.html#aliases
Ответ 3
TypeScript import
ключевое слово имеет несколько вариантов использования, некоторые в зависимости от среды, объясняя, почему это запутывает. Посмотрим, что с минимальным уровнем детализации (в реальном проекте это может быть еще более сложным):
Модули CommonJs/Node
@mfc: Это тот случай, который соответствует вашему вопросу.
Проект TypeScript использует модули CommonJs, как правило, проект node:
// tsconfig.json
{
"compilerOptions": {
"module": "commonjs",
...
}
}
В этом контексте import _ = require('http');
(версия # 1) передается на var _ = require('http');
(версия # 2). Таким образом, версия # 1 является синтаксисом TypeScript, тогда как версия # 2 является синтаксисом JavaScript.
require()
поддерживается в версии 1, но не в версии №2 (ошибка [ts] Cannot find name 'require'.
), если не добавить node к проекту через npm i @types/node --save-dev
(см. этот fooobar.com/info/31828/...).
Модули ES6
@mfc: Это не тот случай, о котором вы просили. Но это в Trott answer, поэтому я принял это во внимание.
import
является ключевым словом ES6 и имеет собственный синтаксис:
- "Полный" импорт именованного экспорта:
import * as lib from 'lib';
- "Выбор" импорта именованного экспорта:
import { square, diag } from 'lib';
- Импорт экспорта по умолчанию:
import myFunc from 'myFunc';
Эти импортные копии передаются по-разному в соответствии с упомянутым выше параметром компилятора модуля:
-
ES6
→ без изменений
-
CommonJS
→ var ... = require('...');
-
AMD
→ define(...);
Пространство имен
Алиас
@mfc: Это не тот случай, о котором вы просили. Но это в Хосе Ответ, поэтому я добавил сюда, чтобы получить полную картину.
В namespace
, ранее называемый "(внутренний) модуль", import
используется для создания alias, ярлык для экспортируемого элемента другого пространства имен.
namespace Root.Branch.Leaf {
export const configPath = '...';
}
namespace LeafClient {
import configPath = Root.Branch.Leaf.configPath;
console.log(`configPath=${configPath}`);
}
Строка import configPath = Root.Branch.Leaf.configPath;
переводится в var configPath = Root.Branch.Leaf.configPath;
, ср. TypeScript PlayGround.
Остерегайтесь использования вне пространства имен, поскольку оно создало глобальные переменные!
Глобальный модуль
Некоторые библиотеки изменяют глобальный объект (глобальная переменная window
в браузере), например:
Синтаксис ES6 также позволяет загружать этот вид библиотеки с помощью только для импортных эффектов: import "reflect-metadata";
TypeScript поддерживает этот вид импорта. Компилятор попытается получить соответствующее определение ввода, чтобы понять эффекты библиотеки, например новый метод Reflect.getMetadata()
.