TypeScript, tür takma adlarına izin veriyor mu?


91

Keşke şuna benzeyen çirkin bir tip için bir takma ad kullanabilseydim:

Maybe<Promise<Paged<Carrier>, Problem>>[]

Gibi bir şey:

import Response = Maybe<Promise<Paged<Carrier>, Problem>>[];

TypeScript'te tür takma adları yapmanın bir yolu var mı?


Ryan'ın cevapladığı gibi. Yine de eksik olan bir şey, operatörün aşırı yüklenmesi, bu yüzden sayı gibi bir şeyi genişletemezsiniz
basarat

1
3 gün önce, tür takma adları tanıtıldı: blogs.msdn.com/b/typescript/archive/2014/11/18/…
gizli


Mükemmel soru, teşekkür ederim!
Pedro Ferreira

Yanıtlar:


126

1.4 sürümünden, Typescript, tür takma adlarını ( kaynak ) destekler .

Tür Takma Adları

Artık type anahtar sözcüğünü kullanarak bir tür için bir takma ad tanımlayabilirsiniz:

type PrimitiveArray = Array<string|number|boolean>;
type MyNumber = number;
type NgScope = ng.IScope;
type Callback = () => void;

Tür takma adları, orijinal türleriyle tamamen aynıdır; onlar sadece alternatif isimlerdir.

1.6 sürümünden itibaren Typescript, genel tür takma adlarını ( kaynak ) destekler .

Genel tür takma adları

TypeScript 1.6'ya kadar, tür takma adları, uzun tür adlarını kısaltan basit takma adlarla sınırlıydı. Ne yazık ki, bunları jenerik yapmadan sınırlı kullanımları vardı. Artık tür takma adlarının genel olmasına izin vererek onlara tam ifade yeteneği veriyoruz.

type switcharoo<T, U> = (u: U, t:T)=>T;
var f: switcharoo<number, string>;
f("bob", 4);

1.4'teki tür takma adları, en azından çoğu şeyin genel olduğu ortamlarda onları çoğunlukla işe yaramaz hale getiren tür parametrelerini desteklemiyor. Takma adlara tür parametreleri eklemek için tartışmada başka bir talep daha var: github.com/Microsoft/TypeScript/issues/1616 Umarım bu özellik için yeterince ilgi yaratılır, böylece hayata geçirilir.
Trident D'Gao

3
@AlekseyBykov'dan gelen yoruma göre - jenerik tür takma adları artık yayında! Bkz. Github.com/Microsoft/TypeScript/pull/3397
brynb

Örnek oluşturmak için kullanamayacağınız için bu tür takma adları işe yaramaz buluyorum. Bu başarısız:type MyMap = Map<string, string>; let map = new MyMap();
jlh

@jlh Tür takma adları (ve genel olarak türler) derlemeden sonra silinir. Bu nedenle, istediğiniz gibi çalışmasını sağlamak için TS'nin newaramayı yeniden yazması veya tür takma adı için bazı kodlar üretmesi gerekir . Ve bu genel olarak TS felsefesine ve tasarım hedeflerine aykırıdır . Her zaman MyMaptemelini saran kendi sınıfınızı veya işlevinizi oluşturabilirsinizMap<string, string>;
Mariusz Pawelski

@MariuszPawelski Evet, onu paketledim, ancak temelde kullanmak istediğiniz birçok yöntem varsa bu bir acı. Bu türleri genişletmek mümkün olsaydı önemsiz olurdu, ama bu da işe yaramıyor, en azından işe yaramıyor Map, bunun için açık bir sorun var.
jlh

11

TypeScript içe aktarmaları destekler, örneğin:

module A {
    export class c {
        d: any;
     }
}

module B {
    import moduleA = A;

    var e: moduleA.c = new moduleA.c();
}

module B2 {
    import Ac = A.c;

    var e: Ac = new Ac();
}

Güncelleme 1

TS 1.4'ten beri tip bildirimlerini kullanabiliriz:

type MyHandler = (myArgument: string) => void;

var handler: MyHandler;

TS 1.6'dan beri yerel tip bildirimlerini kullanabiliriz:

function f() {
    if (true) {
        interface T { x: number }
        let v: T;
        v.x = 5;
    }
    else {
        interface T { x: string }
        let v: T;
        v.x = "hello";
    }
}

8

Fakir bir adamın çözümü, tistenen tipte bir kukla değişken (örneğin ) bildirmek typeof tve uzun tipli ifade yerine kullanmaktır :

var t: {(x: sayı, f: {(foo: string, bar: boolean): void}): void};

var f: typeof t;
var g: typeof t;
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.