Typescript import/as vs import/require?

Adam Thompson picture Adam Thompson · Feb 29, 2016 · Viewed 97.6k times · Source

I am using TypeScript with Express/Node.js.

For consuming modules, the TypeScript Handbook shows the following syntax:

import express = require('express');

But also the typescript.d.ts file shows:

import * as express from "express";

I also searched the MSDN blog but could not find anything.

Which one is more correct as of early 2016? What are the differences between the two, if any?

Where is the best source to find information on the latest syntax to use so I can find this information in the future?

Answer

Ryan Cavanaugh picture Ryan Cavanaugh · Feb 29, 2016

These are mostly equivalent, but import * has some restrictions that import ... = require doesn't.

import * as creates an identifier that is a module object, emphasis on object. According to the ES6 spec, this object is never callable or newable - it only has properties. If you're trying to import a function or class, you should use

import express = require('express');

or (depending on your module loader)

import express from 'express';

Attempting to use import * as express and then invoking express() is always illegal according to the ES6 spec. In some runtime+transpilation environments this might happen to work anyway, but it might break at any point in the future without warning, which will make you sad.