2016-01-28 18 views
7

vorrei aggiungere una proprietà, id, al di Check Request interfaccia. Express ha una definizione di tipo DefinitelyTyped. Ho provato tutti i modi di specificare l'interfaccia per l'unione, il che risulta in un errore o non funziona.Dichiarazione fusione con moduli stile ES6

che sto accedendo tipizzazioni di Express utilizzando ES6 importazioni modulo stile: import * as express from 'express';

Ho provato la fusione con l'oggetto Request nel Express namespace.

declare module Express { 
    export interface Request { 
     id: number;   
    } 
} 

Questo silenziosamente non fa nulla. Ho provato la fusione con l'attuale modulo di al posto dello spazio dei nomi, seguendo le indicazioni del nuovo 1.8 compilatore che io sto usando:

import { Request } from 'express'; 

declare module 'express' { 
    interface Request { 
     id: number;   
    }  
} 

Questo errori perché Module augmentation cannot introduce new names in the top level scope.

Quando apro l'attuale express.d.ts di file, sembra che ci sia un module e { ... } contenente tutte le interfacce, all'interno di un declare module "express" { ... } che contiene una linea di export = e;. Forse questo è in qualche modo il problema, a causa del nidificazione dello spazio dei nomi?

Come si fa correttamente?

risposta

1

Nelle versioni precedenti alla v1.8 dattiloscritto questo non era consentito.

Da v1.8 in poi, modulo additiva è disponibile. La sintassi è identica alle dichiarazioni ambient (come hai mostrato nella tua domanda) - l'unica differenza è che ciò che hai postato sopra dovrebbe funzionare ora.

Module aumento consente di estendere la portata globale e il modulo.

di estendere la portata globale, si può usare global come nome del modulo a tre:

declare global { 
    interface Array<T> { 
     popFromTop(): T; 
    } 
} 
+0

Ho appena visto che ora è consentito in 1.8. Tuttavia, non funziona ancora sul compilatore beta. Ho intenzione di aggiornare la domanda con maggiori dettagli. –

+0

Modificato. Spero che tu possa dare un'altra occhiata. :) –

0

Voglio aggiungere i miei 2 centesimi qui; questo è come vorrei aggiungere id proprietà Request

  1. Definire dove si vuole un file .d.ts; sta andando a contenere i vostri tipi personalizzati condivisi attraverso l'intero progetto Io di solito lo chiamo index.d.ts Non sarà in grado di importare i tipi di moduli in questo file (in quanto si tratta di un file di dichiarazione ambientale). In questo esempio:

index.d.ts

interface Identificable { 
    id: number 
} 
  1. Nel file dattiloscritto, richiesta di importazione come al solito e definire un nuovo tipo che si applica sia Request e il tipo.

handler.ts

import { Request, Response } from 'express' 

type IdentificableRequest = Request & Identificable 

function myHandler(req: IdentificableRequest, res: Response) { 
    const id = req.id // fine 
    const params = req.params // fine too 
    ... 
} 
0

Il mio problema era che in package.json ho avuto "typescript": "2.0.3" e sul sistema ho la versione 2.3.3 installato.

Ho rimosso la versione 2.3.3 e installato la versione 2.0.3, e ha funzionato.

Problemi correlati