2017-09-22 8 views
0

Dans mon projet TypeScript, je souhaite utiliser un module Node.js appelé "pure-uuid".TypeScript: la valeur par défaut n'est pas un constructeur

Avec JavaScript plaine, "pure-UUID" peut être utilisé comme suit:

const UUID = require('pure-uuid') 
const id = new UUID(4).format(); 

Je traduis le code dans tapuscrit:

import UUID from 'pure-uuid'; 
const id:string = new UUID(4).format(); 

Quand je compile le code, la suivante est produit:

"use strict"; 
Object.defineProperty(exports, "__esModule", { value: true }); 
var pure_uuid_1 = require("pure-uuid"); 
var id = new pure_uuid_1.default(4).format(); 

Malheureusement tapuscrit ajoute une .default à la "pure-UUID" re Conférence, ce qui rend le code échouer sur l'exécution:

TypeError: pure_uuid_1.default is not a constructor 

Je pense que la mauvaise compilation est causée par une erreur dans le fichier de définition de tapuscrit (qui a été écrit manuellement):

interface UUID { 
    /* making */ 
    make(version: number, ...params: any[]): UUID; 

    /* parsing */ 
    parse(str: string): UUID; 

    /* formatting */ 
    format(type?: string): string; 

    /* formatting (alias) */ 
    tostring(type?: string): string; 

    /* importing */ 
    import(arr: number[]): UUID; 

    /* exporting */ 
    export(): number[]; 

    /* byte-wise comparison */ 
    compare(other: UUID): boolean; 
} 

export interface UUIDConstructor { 
    /* default construction */ 
    new(): UUID; 

    /* parsing construction */ 
    new(uuid: string): UUID; 

    /* making construction */ 
    new(version: number): UUID; 
    new(version: number, ns: string, data: string): UUID; 
} 

declare var UUID: UUIDConstructor; 
export default UUID; 

Quelle est la bonne manière d'exporter le module "pur-uuid"?

+0

Vous ne pouvez pas déclarer une déclaration du constructeur dans une interface. – Donal

+0

Essayez: 'export = UUID;' – Paleo

+0

@Paleo, en utilisant 'export = UUID;' montre 'erreur TS2693: 'UUID' fait seulement référence à un type, mais est utilisé comme valeur ici. 'Lors de l'écriture d'un nouvel UUID (4) .format() '. –

Répondre

0

Vous ne pouvez pas déclarer une déclaration de constructeur dans une interface. Typescript est un sur-ensemble de JavaScript, il inclut JavaScript. Par conséquent, votre tapuscrit devrait être simplement ceci:

const UUID = require('pure-uuid'); 
const id = new UUID(4).format(); 
+0

En utilisant 'const UUID = require ('pure-uuid');' Je perds l'avantage d'avoir des types et des complétions automatiques basés sur des types de 'UUID'. –

1

Essayez avec export =:

interface UUID { 
    // ... 
} 

interface UUIDConstructor { 
    /* default construction */ 
    new(): UUID; 
    // ... 
} 

declare var tmp: UUIDConstructor; 
export = tmp; 

Voir aussi: The documentation on export =.

Ensuite, le code suivant:

const UUID = require('pure-uuid') 

... doit être traduit par:

import * as UUID from 'pure-uuid'; 
+0

Merci pour l'indice. Si je fais cela, que je reçois l'erreur suivante: 'erreur TS1192: Module '" ../node_modules/pure-uuid/uuid "' n'a pas d'exportation par défaut. –

+0

@BennyNeugebauer J'ai édité. L'équivalent de 'const UUID = require ...' est 'import * comme UUID de ...'. – Paleo