Подтвердить что ты не робот

Любой способ объявить структуру класса гнезда в typescript?

Я заинтересован в определении существующей структуры (openlayers.d.ts), но не могу понять, как выразить тот факт, что OpenLayers.Layer является как классом, так и пространством имен для OpenLayers.Layer.Markers. Я считаю, что это делает Markers вложенным классом слоя.

использование:

l = new OpenLayers.Layer(...); // this is a base class, never do this
m = new OpenLayers.Layer.Markers(...);

Как бы вы объявили класс Layer и Markers в typescript?

4b9b3361

Ответ 1

Кажется, что он исправлен в версиях 0.9.1.1 и новее. Вам просто нужно создать модуль с тем же именем, что и класс, в котором вы хотите вставить типы, и вставьте в него свои вложенные типы.

Более конкретно, так вы это делаете:

declare module a
{
    class b
    {
    }

    module b
    {
        class c
        {
        }
    }
}

var myB = new a.b();
var myC = new a.b.c();

Это также работает при вложенности типов в typescript код с ключевым словом export:

export module a
{
    export class b
    {
    }

    export module b
    {
        export enum c
        {
            C1 = 1,
            C2 = 2,
            C3 = 3,
        }
    }
}

Как уже упоминалось пользователем @recursive в комментариях ниже, порядок декларирования важен. Поэтому определение класса должно быть расположено перед модулем с вложенными типами.

Ответ 2

Вы можете использовать слияние модулей, чтобы получить эквивалентный эффект для вложенных классов. Этот пример адаптирован из главы 1 Pro TypeScript.

Вы выполняете объединение модулей с классом и модулем или с помощью функции и модуля.

Во всех случаях модуль должен появиться после того, как класс или функция слияния будут работать.

Адаптированный пример:

class Outer {

}

module Outer {
    export class Mid {

    }

    export module Mid {
        export class Inner {

        }
    }
}

var a = new Outer();
var b = new Outer.Mid();
var x = new Outer.Mid.Inner();

Оригинальный ответ

Примечание: этот оригинальный ответ (отправленный в 2012 году) применяется к версии 0.8 TypeScript.

Вы все равно можете создать объявление, которое позволит использовать описанные вами способы использования, просто объект Markers будет иметь тип any. Это можно улучшить, если исправлен элемент работы вложенного класса.

declare module OpenLayers {
    export class Layer {
        constructor(param: string);
        static Markers(param: string);
    }
}


var l = new OpenLayers.Layer('...'); // this is a base class, never do this
var m = new OpenLayers.Layer.Markers('...');

Ответ 3

По состоянию на 2016 год, я думаю, это проще:

class A {
    static B = class { }
}

var a = new A();
var b = new A.B();

Ответ 5

Это немного поздно, но другие могут оказаться полезными. Вот как я сделал это, чтобы обмануть TS для выполнения задачи.

declare module OpenLayers {
  interface Layer { 
   ....
  }

  interface Markers {
    ....
  }

  var Layer: {
    new(name:string, options?:any):Layer;
    prototype:Layer;
    Markers: { 
      new(params?:any):Markers;
      prototype: Markers;
    }
  }
}

var markers = new OpenLayers.Layer.Markers();

Ответ 6

Используйте выражения TypeScript для этого выражения:

var OpenLayers = class {
    static Layer = class {
        static Markers = class {}
    }
}