Синтаксис TypeScript .d.ts - экспорт и объявление

Мне нужна помощь, чтобы понять, как правильно создать файл .d.ts.

Меня поразило то, что некоторые люди используют этот синтаксис:

// lib-a.d.ts
namespace My.Foo.Bar {
  interface IFoo {}
  interface IBar {}
}

vs.

// lib-b.d.ts
declare namespace My.Foo.Bar {
  interface IFoo {}
  interface IBar {}
}

vs.

// lib-c.d.ts
namespace My.Foo.Bar {
  export interface IFoo {}
  export interface IBar {}
}

vs.

// lib-d.d.ts
declare namespace My.Foo.Bar {
  export interface IFoo {}
  export interface IBar {}
}

vs.

// lib-e.d.ts
declare module My.Foo.Bar {
  export interface IFoo {}
  export interface IBar {}
}

Который правильный? Для чего используется декларация? Для чего используется экспорт? Когда использовать пространство имен по сравнению с модулем?


person Mohamed Nuur    schedule 17.01.2017    source источник


Ответы (1)


Правильный способ:

declare namespace NS {
    interface InterfaceTest {
        myProp: string;
    }

    class Test implements InterfaceTest {
        myProp: string;
        myFunction(): string;
    }
}

Вы всегда можете проверить правильность подписи, написав какой-нибудь .ts файл и скомпилировав его с опцией --declaration (tsc test.ts --declaration). Это сгенерирует d.ts файл с правильной типизацией.

Например, указанный выше файл объявления был сгенерирован из следующего кода:

namespace NS {
    export interface InterfaceTest {
        myProp: string;
    }

    export class Test implements InterfaceTest {
        public myProp: string = 'yay';

        public myFunction() {
            return this.myProp;
        }
    }   

    class PrivateTest implements InterfaceTest {
        public myPrivateProp: string = 'yay';

        public myPrivateFunction() {
            return this.myProp;
        }
    }
}
person NoNameProvided    schedule 17.01.2017