В TypeScript, в чем разница между
import http = require('http');
и
var http = require('http');
Я вижу оба способа использования в источнике кода, являются ли они взаимозаменяемыми?
В TypeScript, в чем разница между
import http = require('http');
и
var http = require('http');
Я вижу оба способа использования в источнике кода, являются ли они взаимозаменяемыми?
Ваш оператор import TypeScript и не будет работать как-есть в Node. Вам нужно будет сначала скомпилировать (перевести?) Его на JavaScript. Вы можете прочитать документы TypeScript для получения дополнительной информации о том, как работает TypeScript import. См. Раздел "Going External" в разделе Docs модулей.
В JavaScript есть и ключевое слово import, но оно не работает, как работает TypeScript import. Он будет работать только в версиях Node, которые поддерживают модули ES6. Существуют различия между этими import и require, о которых вы можете прочитать в "Модули ES6: окончательный синтаксис" . Это import - это то, что вы можете сравнить/контрастировать с require, но не реально var.
У меня был тот же запрос. Просто нашел это в разделе "Псевдоним" Typescript:
Это похоже на использование var, но также работает над значениями типа и пространства имен импортированного символа. Важно отметить, что для значений импорт является отличной ссылкой от исходного символа, , поэтому изменения в aliased var не будут отображаться в исходной переменной
https://www.typescriptlang.org/docs/handbook/namespaces.html#aliases
TypeScript import ключевое слово имеет несколько вариантов использования, некоторые в зависимости от среды, объясняя, почему это запутывает. Посмотрим, что с минимальным уровнем детализации (в реальном проекте это может быть еще более сложным):
@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/...).
@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 в браузере), например:
$,Reflect.Синтаксис ES6 также позволяет загружать этот вид библиотеки с помощью только для импортных эффектов: import "reflect-metadata";
TypeScript поддерживает этот вид импорта. Компилятор попытается получить соответствующее определение ввода, чтобы понять эффекты библиотеки, например новый метод Reflect.getMetadata().