TypeScript arabirim özelliği türünü "çıkarmanın" bir yolu var mı?


115

Farz edelim ki, X kitaplığı için bazı arayüzleri içeren bir yazma dosyası var.

interface I1 {
    x: any;
}

interface I2 {
    y: {
        a: I1,
        b: I1,
        c: I1
    }
    z: any
}

Bu kitaplıkla çalışmak için, ile tamamen aynı tipte bir nesnenin etrafından dolaşmam gerekiyor I2.y. Elbette kaynak dosyalarımda aynı arayüzü oluşturabilirim:

interface MyInterface {
    a: I1,
    b: I1,
    c: I1
}

let myVar: MyInterface;

ama sonra onu kütüphaneden gelenle güncel tutma yükünü alıyorum, dahası çok büyük olabilir ve çok sayıda kod tekrarına neden olabilir.

Bu nedenle, arabirimin bu belirli özelliğinin türünü "ayıklamanın" herhangi bir yolu var mı? Şuna benzer bir şey let myVar: typeof I2.y(işe yaramaz ve "I2 adı bulunamıyor" hatasıyla sonuçlanır). Şimdiden teşekkürler.


Düzenleme : TS Playground'da biraz oynadıktan sonra, aşağıdaki kodun tam olarak istediğimi başardığını fark ettim:

declare var x: I2;
let y: typeof x.y;

Bununla birlikte, xbeyan edilecek bir yedek değişkeni gerektirir . Bu beyan olmadan bunu başarmanın bir yolunu arıyorum.


1
hangisi işe yaramıyor - bu nasıl ortaya çıkıyor? Gördüğünüz gerçek hata mesajı nedir?
Bartek Banachewicz

@BartekBanachewicz güncellendi
Kuba Jagoda

Yanıtlar:


234

Daha önce mümkün değildi ama neyse ki şimdi, TypeScript 2.1 sürümünden beri . 7 Aralık 2016'da piyasaya sürüldü ve arama türleri olarak da adlandırılan dizine alınmış erişim türlerini tanıttı .

Sözdizimi tam olarak öğe erişimi gibi görünür, ancak türlerin yerine yazılır. Yani senin durumunda:

interface I1 {
    x: any;
}

interface I2 {
    y: {
        a: I1,
        b: I1,
        c: I1
    }
    z: any
}

let myVar: I2['y'];  // indexed access type

Şimdi myVartürü var I2.y.

TypeScript Playground'da kontrol edin .


1
'Y'nin bir dizi olduğu durumda, elemanların türünü çıkarmanın bir yolu var mı? örneğin I2 {y: {..} []}
John B

1
@JohnB evet, bunu tamamen aynı şekilde yapabilirsiniz, çünkü dizi indeksleri tıpkı nesne özellikleri gibidir. Şuraya göz atın: typescriptlang.org/play/…
Kuba Jagoda

1
@JohnB evet, aynı şekilde erişebilirsiniz yani. I2['y'][0]Bakınız: typescriptlang.org/play/…
Michał Miszczyszyn

2
Bu gerçekten harika bir yetenek
Geradlus_RU

1
I2Tür olarak tanımlanan bir nesnenin anahtarları üzerinde döngü yaptığımızı varsayalım . Döngü yaparken belirli bir anahtarın türünü dinamik olarak nasıl elde ederim? Bu; let z: typeof x[a];, adizge olarak belirli bir anahtar nerede çalışmaz. Bana bunun abir değere işaret ettiğini ve bir türe başvurması gerektiğini söylüyor . Bunu nasıl yapacağım? Herhangi bir şekilde mümkün mü? Teşekkürler!
Emil Walser

-1

Arayüz, bir nesnenin tanımı gibidir. O zaman y, I2 nesnenizin bir özelliğidir, yani belirli bir tiptedir, bu durumda "anonim" dir.

Y'yi tanımlamak için başka bir arayüz kullanabilir ve ardından bunu y türünüz olarak kullanabilirsiniz.

interface ytype {
   a: I1;
   b: I1;
   c: I1;
}

interface I2 {
    y: ytype;
    z: any;
}

Arayüzünüzü bir dosyaya koyabilir ve projenizin diğer dosyalarına aktarabilmek için extract'ı kullanabilirsiniz.

export interface ytype {
   a: I1;
   b: I1;
   c: I1;
}



 export interface I2 {
        y: ytype;
        z: any;
    }

Bunu şu şekilde içe aktarabilirsiniz:

   import {I1, I2, ytype} from 'your_file'

Her şey yolunda, ama bahsettiğim gibi - I1 ve I2 arayüzleri harici bir kütüphaneden geliyor ve bu kütüphane için d.ts dosyasında tanımlanıyor. Bu nedenle, bu ytype arayüzüne sahip olmak bir kod kopyası olacaktır ve sürekli güncellenmesi gerekecektir.
Kuba Jagoda
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.