Ben Yerine daktilo herhangi Tipi Birçok Türleri biri olarak Parametre Tipi belirtin miyim?

oy
9

Daktilo Metod, parametre dizileri, Boolean veya sayıların türü dizi olabilir. Ben herhangi bir [] olarak beyan etmek zorunda da bu üç türden olduğu gibi giriş türünü sınırlamak için bir yol yoktur musunuz?

Oluştur 08/10/2012 saat 07:50
kaynak kullanıcı
Diğer dillerde...                            


6 cevaplar

oy
25

Typescript 1.4 tanıtıldı Birliği Türleri cevabı şimdi yani evet, yapabilirsin .

function myFunc(param: string[] | boolean[] | number[]): void;

Bir derleme hatası tetikleyecektir belirtilenler dışında türünün kullanılması.


Birden belirli türleri bir dizi istiyorsanız, bunun için de Birlik Türleri kullanabilirsiniz:

function myFunc(param: (string|boolean|number)[]): void;

Bu OP istedi olduğundan farklı olduğunu unutmayın. Bu iki örnek farklı anlamları vardır.

Cevap 28/08/2015 saat 05:21
kaynak kullanıcı

oy
7

Bu biraz eski soru gibi görünüyor, ama yine de, ben karşıya geldi ve ben getirmek bu diğer cevabını cevapsız.

Typescript 1.4 itibaren böyle bir işlev parametresi için birden çok olası türlerini bildirmek mümkün olduğunu görünüyor:

class UtilsClass {
    selectDom(element: string | HTMLElement):Array<HTMLElement> {
        //Here will come the "magic-logic"
    }
}

Bunun nedeni "birlik-türleri" yeni typescript kavramının olduğunu.

Daha görebilirsiniz burada .

Cevap 14/05/2015 saat 09:56
kaynak kullanıcı

oy
1

Hayır typescript sadece tek opsiyonel örneğin bir parametrede TypeAnnotation destekler x: stringizin verilen türleri bir dizi devlet olamaz, böylece, sayı veya herhangi.

Bununla birlikte, typescript fonksiyonu aşırı yük (belgeler p51) destekler:

Fonksiyon aşırı yükler bir imza ile mümkün olandan işlevi tarafından desteklenen çağırma desen daha doğru bir şekilde belirlenmesine izin vermek. [...]

    function attr(name: string): string;
    function attr(name: string, value: string): Accessor;
    function attr(map: any): Accessor;
    function attr(nameOrMap: any, value: string): any {
        if (nameOrMap && typeof nameOrMap === "object") {
            // handle map case
        }
        else {
            // handle string case
        }
    }

Kullanabileceğiniz otherwsie typeoftip kontrolleri, ancak bu türü ascpect sayaçları Tipi Komut biraz.

function myFunc(x){
    if(typeof x !== "string" && typeof x !== "object" && typeof x !== "number")
        throw new TypeError("Unsupported type!");
}
Cevap 08/10/2012 saat 08:08
kaynak kullanıcı

oy
1

Bunu yapmak için fonksiyon aşırı yüklenmeleri kullanabilirsiniz:

class Thing {
    public foo(x: number[]);
    public foo(x: bool[]);
    public foo(x: string[]);
    public foo(x: any[]) {
       // Note: You'll have to do type checking on 'x' manually
       // here if you want differing behavior based on type
    }
}

// Later...
var t = new Thing();
t.foo(someArray); // Note: External callers will not see the any[] signature
Cevap 08/10/2012 saat 08:07
kaynak kullanıcı

oy
0

Bu sorunu çözmek için başka bir yol, giriş türleri arasında genel yöntem ve özelliklerini bulmak ve bu ortak metodlarını ve özelliklerini korur yöntem bildiriminde bir in-line tipi bildirmektir. Bunun gibi:

methodName(param1: { prop1: number; prop2: string; }, param2: { propA: bool; propB: string; } ): methodResultType;
Cevap 08/10/2012 saat 08:21
kaynak kullanıcı

oy
0

dizeleri, boolean ve sayılar ilkel türleri şunlardır beri basit bir yolu yoktur sanmıyorum. Farklı nesne türlerinin bir kümesi kullanmak istiyorsanız, bunu belki bir süper sınıfın ile gelip ve ardından yöntemin arayüzünde süper sınıfını belirtebilirsiniz. Öte yandan, aynı zamanda dizeleri, Boolean ve tamsayılar diziler için farklı uygulamaları belirtmek için yöntem aşırı yüklenmesini kullanabilirsiniz.

Cevap 08/10/2012 saat 08:08
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more