Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using a type as a value in typescript

I'm using inject-loader to mock dependencies for a Typescript project being unit tested. The service I'm testing has an import line like this:

import pnp, { SearchQuery, Sort, SortDirection, CamlQuery } from "sp-pnp-js";

For my test, I want to mock several of the functions on pnp, but keep the classes intact. In my unit test file, I've included this import:

import { SearchQuery, Sort, SortDirection, CamlQuery } from "sp-pnp-js";

Which gives my test access to the necessary classes. I've declared a mock service object:

// mock services
const mockPnp = {
    default: { ... }
};

Which I'm wiring into my target class instance:

Service = require("inject!./sharepointservice")({
    "sp-pnp-js": mockPnp
}).Service;

And everything works, so long as I don't run any code that references those classes (ie. SearchQuery). To get that to work, I tried adding it to the mock:

// mock services
const mockPnp = {
    default: { ... },
    SearchQuery: SearchQuery
};

However, I get a 'SearchQuery' only refers to a type, but is being used as a value here error.

I've tried casting to any (same error), tricks with modules and exports, with no luck. I'm supposed to be able to write any Javascript with Typescript, and this would work trivially in Javascript - what am I missing here?

like image 918
Jonathan Rupp Avatar asked Jan 24 '17 16:01

Jonathan Rupp


1 Answers

According to the definition file SearchQuery is an interface, which means that you can not treat it as a value (as the error message says).

Typescript interfaces aren't being compiled into the js output, and you can not use them at runtime.

like image 86
Nitzan Tomer Avatar answered Oct 14 '22 23:10

Nitzan Tomer