Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to import a js library without definition file in typescript file

I want to switch from JavaScript to TypeScript to help with code management as our project gets larger. We utilize, however, lots of libraries as amd Modules, which we do not want to convert to TypeScript.

We still want to import them into TypeScript files, but we also do not want to generate definition files. How can we achieve that?

e.g. The new Typescript file:

/// <reference path="../../../../definetelyTyped/jquery.d.ts" /> /// <reference path="../../../../definetelyTyped/require.d.ts" /> import $ = require('jquery'); import alert = require('lib/errorInfoHandler'); 

Here, lib/errorInfoHandler is an amd module included in a huge JavaScript library that we do not want to touch.

Using the above code produces the following errors:

Unable to resolve external module ''lib/errorInfoHandler''  Module cannot be aliased to a non-module type. 

This should actually produce the following code:

define(["require", "exports", "jquery", "lib/errorInfoHandler"], function(require, exports, $, alert) { ...  } 

Is there a way to import a JavaScript library into TypeScript as an amd Module and use it inside the TypeScript file without making a definition file?

like image 378
tune2fs Avatar asked Apr 03 '14 15:04

tune2fs


People also ask

Can you use JS library in TypeScript?

The short answer is definitely YES ! but you need some intermediate steps ! Please note that ,you can write plain old JavaScript in a TypeScript project without any problems since JavaScript is a subset of TypeScript ,you only need these steps if you are planning to use an external JavaScript library with TypeScript .


2 Answers

A combination of the 2 answers given here worked for me.

//errorInfoHandler.d.ts declare module "lib/errorInfoHandler" {    var noTypeInfoYet: any; // any var name here really    export = noTypeInfoYet; } 

I'm still new to TypeScript but it looks as if this is just a way to tell TypeScript to leave off by exporting a dummy variable with no type information on it.

EDIT

It has been noted in the comments for this answer that you can achieve the same result by simply declaring:

//errorInfoHandler.d.ts declare module "*"; 

See the github comment here.

like image 172
Pure Function Avatar answered Sep 29 '22 00:09

Pure Function


Either create your own definition file with following content:

declare module "lib/errorInfoHandler" {} 

And reference this file where you want to use the import.

Or add the following line to the top of your file:

/// <amd-dependency path="lib/errorInfoHandler"> 

Note: I do not know if the latter still works, it's how I initially worked with missing AMD dependencies. Please also note that with this approach you will not have IntelliSense for that file.

like image 28
thomaux Avatar answered Sep 29 '22 01:09

thomaux