Любой способ объявить структуру класса гнезда в 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?
Ответы
Ответ 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();
Ответ 4
В настоящее время поддержка вложенных классов отсутствует.
http://typescript.codeplex.com/workitem/460
Ответ 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 {}
}
}