2016-08-18 4 views
1

Mein Problem entsteht durch den Versuch, eine TypeScript-Typ-Definition .d.ts zu einer 3rd-Party-Bibliothek hinzuzufügen. Denken Sie daran, dass ich diese Bibliothek nicht kontrolliere, ich versuche nur, sie zu konsumieren und den TSC-Compiler zu beschwichtigen.Ich suche Typescript Typ Definition new + callable clearation

die Richtlinien hier Lesen re: Schreiben d.ts Dateien:

https://typescript.codeplex.com/wikipage?title=Writing%20Definition%20%28.d.ts%29%20Files

ich bei diesem speziellen Beispiel stehe auf: New + aufrufbare Methoden

Hier zeigt die Dokumentation folgendes Muster:

interface Widget { 
    sprock(): void; 
} 

interface WidgetFactory { 
    new(name: string): Widget; 
    (width: number, height: number): Widget; 
} 

declare var widget: WidgetFactory; 

Darauf aufbauend Ich habe folgendes für meine Bedürfnisse erstellt:

declare module "react-localization" { 
    interface LocalizedStringsMethods { 
     setLanguage(language: string): void; 
     getLanguage(): string; 
     getInterfaceLanguage(): string; 
     formatString(str: string, ...values: any[]): string 
     getAvailableLanguages(): string[] 
    } 

    interface LocalizedStringsFactory { 
     new (props: any): LocalizedStringsMethods; 
    } 

    var LocalizedStrings: LocalizedStringsFactory; 

    export default LocalizedStrings; 
} 

Die bemerkenswerte Ausnahme ist die Dokumentation Version nicht declare module nicht verwendet. Abgesehen davon sollten diese für mein Auge die gleichen sein und ein ähnliches Resultat ergeben; Mir fehlt eindeutig etwas. Ich bekomme stattdessen den folgenden Fehler:

Fehler TS2351: Kann 'neu' nicht mit einem Ausdruck verwenden, dessen Typ einen Aufruf fehlt oder Signatur erstellen.

Ich kann meine Definition dies ändern:

declare module "react-localization" { 
    var LocalizedStrings: any; 
    export = LocalizedStrings; 
} 

Der Fehler ist jetzt weg, aber ich verlieren alle die wunderbare Art Informationen. .? = (

ich ratlos bin Was genau falsch hier tun

Ok, um das Geheimnis zu schreiben, ich versuchte dabei export = im volleren Typ Beispiel statt export default:

declare module "react-localization" { 
    interface LocalizedStringsMethods { 
     setLanguage(language: string): void; 
     getLanguage(): string; 
     getInterfaceLanguage(): string; 
     formatString(str: string, ...values: any[]): string 
     getAvailableLanguages(): string[] 
    } 

    interface LocalizedStringsFactory { 
     new (props: any): LocalizedStringsMethods; 
    } 

    var LocalizedStrings: LocalizedStringsFactory; 

    export = LocalizedStrings; // <----- HERE instead of export default 
} 
?

Kann mir jemand erklären, warum das funktioniert aber export default endet undefined Rückkehr auch ich habe diese importieren wie:

import * as LocalizedStrings from 'react-localization' ich würde es vorziehen, den Import alszu tun. An dieser Stelle werde ich mit der ersten leben, ich möchte nur verstehen warum.

+1

zusätzlich scheint es, dass es relevant ist, dass diese 3rd Party Lib von babel kompiliert wird: https://github.com/Microsoft/TypeScript/issues/5565 'Wenn Babel ein Modul umsetzt, dessen einziger Export ein Export ist Standardmäßig wird ein Modul injiziert.Exporte = Exporte ["Standard"]; In den generierten Code wird das exportierte Objekt zur Funktion selbst (anstelle eines Modulobjekts, das die Funktion als Standardeigenschaft hat). " –

Antwort

0

Lösung ist:

react-localization.d.ts

declare module "react-localization" { 
    interface LocalizedStringsMethods { 
     setLanguage(language: string): void; 
     getLanguage(): string; 
     getInterfaceLanguage(): string; 
     formatString(str: string, ...values: any[]): string 
     getAvailableLanguages(): string[] 
    } 

    interface LocalizedStringsFactory { 
     new (props: any): LocalizedStringsMethods; 
    } 

    var LocalizedStrings: LocalizedStringsFactory; 

    export default LocalizedStrings; 
} 

yourFile.ts

import LocalizedStrings from 'react-localization'; 

var x = new LocalizedStrings(123); 

Wenn Sie export = dann import = require() verwenden möchten verwendet werden soll. Mehr Details in https://www.typescriptlang.org/docs/handbook/modules.html

+1

Es stellt sich heraus, dass es nuanciert ist. Weil diese lib 'react-localisation' von babel transpiliert wird, nach der Erklärung von Anders in http://github.com/Microsoft/TypeScript/issues/5565, macht babel folgendes:' module.exports = exports ["default"] ; 'setzt das ganze Modul auf die Funktion, die unter Standard-Import in Typescript versucht, dies zu tun:' function() {...}. default', was in der Tat 'undefiniert' ist. Daher wird 'Import * als Thing von' Thing 'benötigt. Das Entfernen dieser Zeile 'module.exports = exports [" default "];' erlaubt typescript effektiv: '{default: } .default' aka:' import Thing from 'ding' ' –

+0

@ adam-venturella ja, danke fürs heben dieses Problem auf. Leider habe ich keinen Standard, um mit echten Babel-Ergebnissen zu spielen. Und tut mir leid, wenn meine Antwort irrelevant ist –