TypeScript'te yuvalanmış sınıflar oluşturabilir misiniz?


Yanıtlar:


132

TypeScript 1.6'dan başlayarak sınıf ifadelerimiz var ( referans ).

Bu, aşağıdakileri yapabileceğiniz anlamına gelir:

class Foo {
    static Bar = class {

    }
}

// works!
var foo = new Foo();
var bar = new Foo.Bar();

1
bu örnek Typescript 1.6.3'te çalışmıyor: TS4028 Dışa aktarılan sınıfın genel statik özelliği 'Bar' özel ada sahip veya kullanıyor '(Anonim sınıf)'.
Sergey

1
@Sergey Aynı problemi yaşadım, bu yüzden aşağıdaki cevabıma göre ad alanlarını kullanmaya başladım.
Dan Def

Bir sınıf içinde arayüz oluşturmanın bir yolu var mı? Örneğin, bu
Çubuğun

@LittaHervi - Bir kullanım durumu, örneğin bir fabrika yönteminden harici bir arabirimin özel bir uygulamasını döndürmektir. Java'dan (ve diğerlerinden) bir başka örnek, içerdikleri sınıfın üye değişkenlerine ayrıcalıklı erişim gerektiren ve kapsam belirleme kuralları aracılığıyla bunu otomatik olarak yapan yineleyicilerdir, ancak bunların doğrudan dışa aktarılmasını ve başlatılmasını asla istemezsiniz.
Dave

35

Burada, sınıf ifadelerinin kullanıldığı daha karmaşık bir kullanım durumu verilmiştir .

İç sınıfın dış sınıfınprivate üyelerine erişmesine izin verir .

class classX { 
    private y: number = 0; 

    public getY(): number { return this.y; }

    public utilities = new class {
        constructor(public superThis: classX) {
        }
        public testSetOuterPrivate(target: number) {
            this.superThis.y = target;
        }
    }(this);    
}

const x1: classX = new classX();
alert(x1.getY());

x1.utilities.testSetOuterPrivate(4);
alert(x1.getY());

Codepen


3
@RyanCavanaugh Bir "iç" sınıf ifadesi içindeki özel üyelere erişme yeteneği bir hata mı?
bnieland

5
Bunun TypeScript ekibiyle doğru kullanım olduğunu doğruladım. github.com/Microsoft/TypeScript/issues/…
bnieland

1
bunu doğrudan iletmeden ana içeriğe erişmek mümkün mü?
shabunc

@shabunc değil benim bilgim
bnieland

19

Bunu, bir derleme hatası almadan dışa aktarılan sınıflarla çalışmasını sağlayamadım, bunun yerine ad alanları kullandım :

namespace MyNamespace {
    export class Foo { }
}

namespace MyNamespace.Foo {
    export class Bar { }
}

Aynı. 'Foo' yalnızca bir türe atıfta bulunur, ancak burada bir ad alanı olarak kullanılmaktadır.
2019

12

Bir tür bildirimi dosyası bağlamındaysanız, bunu sınıfları ve ad alanlarını karıştırarak yapabilirsiniz:

// foo.d.ts
declare class Foo {
  constructor();
  fooMethod(): any;
}

declare namespace Foo {
  class Bar {
    constructor();
    barMethod(): any;
  }
}

// ...elsewhere
const foo = new Foo();
const bar = new Foo.Bar();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.