linq javascript-bibliotek med typescript es6 import-syntax


Jag använder linq (npm linq) med linq.d.ts-filerna från DefinitelyTyped, men jag kan inte få det att fungera med ES6-syntaxen.

Jag försökte den vanliga import {Enumerable} from "linq" men den vägrade att hitta "linq". Jag ändrade beskrivaren till att ha declare module "linq" medan den normalt inte skulle ha citattecken. Nu löser linq sig, men jag måste använda EnumerableStatic, men utgångskoden behöver ha Enumerable och inte EnumerableStatic. Jag trodde att jag kunde komma runt det genom att göra import {EnumerableStatic as Enumerable} from "linq", men detta löser sig inte korrekt.

Har någon fått detta att fungera och i så fall, hur importerar man det?

Svar #1

Definitionsfilen behöver uppdateras:

  1. Dokumentationen och definitionsfilen har olika versaler för funktionsnamnen jämfört med version 3.0.5. Till exempel är Enumerable.From nu Enumerable.from. Du behöver uppdatera definitionsfilen med dessa ändringar.
  2. Definitionsfilen tillåter för närvarande inte externa moduler. Lägg till detta i den:

    declare module "linq" {
        export = Enumerable;
    }
    
  3. Eftersom det sedan använder module.exports=Enumerable i JavaScript-koden, måste du importera det så här:

    import * as Enumerable from "linq";
    

Svar #2

Jag skapade filen main.ts:

/// <reference path="typings/linq/linq.d.ts" />

import { Enumerable } from 'linq';

Jag får TS2307: Cannot find module 'linq'. fel från kompilatorn. När du lägger till några felsökningssatser i tsc.js, får du att denna import leder till att loadModuleFromNodeModules-funktionen körs och failedLookups är:

[ '/var/www/TypeScript-Playground/node_modules/linq.ts',
  '/var/www/TypeScript-Playground/node_modules/linq.tsx',
  '/var/www/TypeScript-Playground/node_modules/linq.d.ts',
  '/var/www/TypeScript-Playground/node_modules/linq/index.ts',
  '/var/www/TypeScript-Playground/node_modules/linq/index.tsx',
  '/var/www/TypeScript-Playground/node_modules/linq/index.d.ts',
  '/var/www/node_modules/linq.ts',
  '/var/www/node_modules/linq.tsx',
  '/var/www/node_modules/linq.d.ts',
  '/var/www/node_modules/linq/package.json',
  '/var/www/node_modules/linq/index.ts',
  '/var/www/node_modules/linq/index.tsx',
  '/var/www/node_modules/linq/index.d.ts',
  '/var/node_modules/linq.ts',
  '/var/node_modules/linq.tsx',
  '/var/node_modules/linq.d.ts',
  '/var/node_modules/linq/package.json',
  '/var/node_modules/linq/index.ts',
  '/var/node_modules/linq/index.tsx',
  '/var/node_modules/linq/index.d.ts',
  '/node_modules/linq.ts',
  '/node_modules/linq.tsx',
  '/node_modules/linq.d.ts',
  '/node_modules/linq/package.json',
  '/node_modules/linq/index.ts',
  '/node_modules/linq/index.tsx',
  '/node_modules/linq/index.d.ts' ]

så det betyder att din fil /var/www/TypeScript-Playground/node_modules/linq/linq.js inte hittas.

Jag skulle posta om din fråga på Gitter eller på issues. Även https://github.com/Microsoft/TypeScript/issues/2242 issue säger att:

I TypeScript 1.5 betraktas en källfil som en extern modul om den innehåller minst ett av följande:

En överordnad deklaration som specificerar en exportmodifierare.

En ny ES6-export- eller importdeklaration av vilken form som helst.

En ursprunglig TypeScript export-equals-uppdrag av formen export=Point.

Ett originalt TypeScript import-equals-uttryck av formen import Math=require("math").

Jag tror inte att linq följer punkterna.

Relaterade artiklar