2017-10-02 4 views
1

Ich möchte Typisierung für ein Javascript-Projekt definieren. Lassen Sie uns eine vereinfachte Version betrachten:Typescript-Typ-Definition verschachtelten Namespace mit Schnittstellen

a 
| 
+ A.js 
+ b 
    | 
    + B.js 

Es gibt einen Ordner ‚a‘, und in ihm dort Ordner ‚b‘ ist, und ich möchte es benutzen, wie:

import { A } from "a" 
import { B } from "a/b" 

Die Typisierung, dass ich würde am liebsten wie folgt aussehen wie etwas haben:

declare namespace a { 
    interface A { } 

    namespace b { 
     interface B { } 
    } 
} 

declare module "a" { 
    export = a 
} 

declare module "a/b" { 
    export = a.b 
} 

aber das gibt mir den Fehler Cannot use namespace 'a' as a value.

Ich bemerkte, wenn ich Interfaces zu Klassen ändere, behebt das Problem. Kann jemand bitte etwas Licht werfen, warum es so ist? Gibt es eine Möglichkeit, solche Definitionen mit Schnittstellen zu bekommen?

Antwort

2

https://github.com/Microsoft/TypeScript/issues/17530

Ein Namespace, die keine Werte oder Aussagen enthält, wird ein instanziierte Namensraum betrachtet und hat keine Laufzeitwert.

Sie können den Fehler vermeiden, indem Sie:

declare module "a/b" { 
    import b = a.b 
    export = b 
} 

jedoch, es sei denn die Namensräume a und a.b tatsächlich als Globals zur Laufzeit sind, sollten Sie schreiben:

declare module "a" { 
    export interface A { 
     foo: string 
    } 
} 

declare module "a/b" { 
    import {A} from 'a' 
    export interface B { 
     bar: A 
    } 
} 
+0

Was Sie tun mean von "es sei denn, die Namespaces a und ab sind zur Laufzeit tatsächlich als globale Variablen verfügbar"? – Wickoo

+1

@Wickoo, d. H. Sie können auf sie zugreifen, ohne sie zu importieren, wie 'setTimeout' –