Подтвердить что ты не робот

TypeScript var vs import

В TypeScript, в чем разница между

 import http = require('http');

и

 var http = require('http');

Я вижу оба способа использования в источнике кода, являются ли они взаимозаменяемыми?

4b9b3361

Ответ 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 → без изменений
  • CommonJSvar ... = require('...');
  • AMDdefine(...);

Пространство имен

Алиас

@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().