2017-02-16 3 views
1

Mein Anwendungsfall erweitern: Anforderung des RequestResponse type definition fehlt die body Eigenschaft und sieht wie folgt aus:Wie Typoskript Schnittstelle in d.ts

declare namespace request { 

    // ... 

    export interface RequestResponse extends http.IncomingMessage { 
     request: Options; 
    } 

    // ... 

} 
declare var request: request.RequestAPI<request.Request, request.CoreOptions, request.RequiredUriUrl>; 
export = request; 

Ich versuche, es zu beheben, indem Sie eine request-fix.d.ts Datei mit so etwas wie dies:

import * as http from 'http'; 
declare namespace request { 
    export interface RequestResponse extends http.IncomingMessage { 
     body: any; 
    } 
} 

Aber es hat keine Wirkung. Mein Endziel ist es, dass in meinem app.ts, kann ich dies tun:

import * as rp from 'request-promise'; 
import { RequestResponse } from 'request'; 

let response = rp.get(url); 

response.statusCode; // works 
response.body; // doesn't compile 

Natürlich habe ich nur zu DefinitelyTyped beitragen könnte :) Aber diese Frage ist über die RequestResponse Schnittstelle zu erweitern.

+0

1. fehlende 'export' für RequestResponse in' request-fix.d.ts' 2. ist 'request-fix.d.ts' zu' files' in 'tsconfig.json' hinzugefügt? – artem

+0

Die Datei '.d.ts' erzeugt keine Kompilierzeitfehler, selbst wenn ich Unsinn dort hinlege. In meinem tsconfig.json: '" Dateien ": [" app.ts "," request-fix.d.ts "]'. Versucht, '/// ' zu meiner app.ts hinzuzufügen, kein Unterschied. – Borek

+0

Oh 'skipLibCheck' war wahr. Das bringt mich voran, zumindest kann ich noch einige Fehler sehen. – Borek

Antwort

6

Hier ist die Kombination, die in request-fix.d.ts funktioniert:

import * as http from 'http'; 

declare module 'request' { 
    export interface RequestResponse extends http.IncomingMessage { 
     body: any; 
    } 
} 

Modul bestehende zu erweitern, declare module muss statt declare namespace verwendet werden, und es muss unter den kompilierten Quellen im Modul Umfang irgendwo erscheinen.

Das heißt, request-fix.d.ts muss einige importieren auf höchster Ebene, um es in ein Modul zu verwandeln, wie Sie mit import * as http from 'http' in Ihrem Code getan haben. Wenn declare module im Nicht-Modulbereich angezeigt wird (wie beim ersten Versuch der Antwort), deklariert es nur separate, nicht verwandte Module wie beschrieben here.

+0

Es funktioniert nicht für mich. Ich habe dieses kleine Repo erstellt, um das Problem zu demonstrieren: https://github.com/borekb/ts-augmentation-demo – Borek

+0

Der Import muss auf der obersten Ebene sein, ich habe die GitHub Demo mit funktionierender Lösung aktualisiert: https: //github.com/borekb/ts-augmentation-demo. (Wenn Sie Ihren Code aktualisieren, werde ich es als eine Antwort markieren. Danke für Ihre Hilfe!) – Borek

+0

Ja, ich habe gerade das gleiche gefunden, die Antwort zu aktualisieren .. – artem

0

@artem ist richtig, +1, wollte nur hinzufügen, dass Sie die Namespaces nicht vergessen sollten.

Zum Beispiel ist dies, wie Sie auf die CardTitle Komponente von material-ui eine className prop hinzufügen:

declare module "material-ui" { 
    namespace __MaterialUI { 
     namespace Card { 
      export interface CardTitleProps { 
       className?: string; 
      } 
     } 
    } 
} 

Die explaination einfach ist .. Module und Namensraum existieren nur in Laufzeit und werden automatisch zusammengeführt.

Verwandte Themen